2010-05-17 20 views
7

Esto es lo que tengo que hacer: Tengo que leer un documento XML con formato y extraer de ella los elementos y sus valores, por ejemplo, en el siguiente código:Un simple XML C analizador

<user name="Mark"> 
    <param name="Age" value="21"/> 
    <param name="Country" value="NL"/> 
</user> 

Necesito para extraer: name = Mark, Age = 21 y Country = NL.

Hasta el día de hoy he estado haciendo este análisis sintáctico manualmente, lo cual es un problema.

Ahora no me importa si el archivo es un "XML correcto" o todo eso, no me importan las DTD u otros requisitos XML estándar. Solo necesito leer y analizar los valores.

¿Alguien sabe (aparte de lib eXpat) una lib para hacer esto o código para hacer esto? Gracias!

Jess

EDIT:

Sí, se me olvidó mencionar la plataforma: Windows y Linux. En la llanura C, C++ no

+2

Al solicitar bibliotecas, es posible que desee mencionar su plataforma, ya que las bibliotecas pueden ser específicas de la plataforma. – WhirlWind

+0

Echa un vistazo a vtd-xml, es mucho más fácil de usar que DOM y SAX –

Respuesta

7
+0

gracias, ya lo he comprobado y 1) me llevó mucho tiempo entender lo que querían de mí (para que funcione) y 2) se queja de que no tengo una DTD y de que mi archivo no está formateado correctamente. entonces, no es una buena solución. – Jessica

+0

Estaba pensando algo más en la línea de http://www.codeguru.com/cpp/data/data-misc/xml/article.php/c4549 – Jessica

+0

No debería requerir una DTD, pero sí requiere que la XML está bien formado, es decir, que las etiquetas de inicio/final coinciden y que no hay caracteres ilegales y que hay un único elemento raíz.Si tu opinión no está bien formada, tal vez deberías solucionarla. Si no requiere que su entrada sea XML bien formado, sino simplemente algo xml-ish, entonces puede escribir fácilmente su propio analizador: simplemente busque los caracteres "<" & ">" para dividirlo en pedazos y luego analizar cada pieza. Gran parte de la complejidad de un analizador XML se debe a que tiene que analizar cualquier XML generalizado en un modelo interno específico. –

1

Si C++ está bien entonces es posible que intenta TinyXML. Lo he usado por unos años y funciona muy bien.

+0

gracias, pero es simple C – Jessica

+0

Lo suficientemente bueno .... –

4

El analizador Expat es el mejor que he encontrado - Yo lo uso en mi código C++ con preferencia a los diversos programas de análisis C++ - pero está escrito en C. Muy fácil de usar e incrustar en su aplicación. Así que no veo por qué en su pregunta que dice:

(que no sea lib expatriados)

¿Tienes algo en contra de ella?

+0

De hecho, definitivamente elegiría expatriados teniendo en cuenta los requisitos establecidos. ¿La única razón para no usarlo en este caso que puedo pensar es si el afiche no tiene la capacidad de crear estructuras de datos a partir de eventos SAX y, por lo tanto, necesita un DOM? –

+0

No, no tengo nada en contra, de hecho lo estoy usando en otro proyecto, sin embargo es grande, y para lo que necesito más complejo de lo que necesito. así que, como lo señalé muy claramente en mi pregunta, no tendré expat como solución – Jessica

+0

@Jessica Debes tener tu propia definición privada de la palabra "grande": Expat es un analizador XML tan pequeño como lo que vas a hacer. obtener. Específicamente, es más pequeño que Mini-XML. –

4

¿Qué hay de Mini-XML? Es ligero, funciona con gcc, es ANSI-C compatibles ...

http://www.minixml.org/index.php

Según la documentación, para buscar nodos específicos serían tan simple como:

/* Find the first "a" element */ 
    node = mxmlFindElement(tree, tree, "a", 
          NULL, NULL, 
          MXML_DESCEND); 

Una vez que obtenga el nodo, puede manipularlo según sus requisitos.

+0

gracias, ya he publicado esto (ver mi propia respuesta a la pregunta) – Jessica