2012-02-27 41 views
8

Estoy tratando de leer un archivo XML en mi programa C++. El archivo XML es como la siguiente:leyendo un archivo XML en un programa C++

<?xml version="1.0" encoding="utf-8"?> 
<myprogram> 
<configuration> 
<window> 
<height> 300 </height> 
<width> 500 </width> 
</window> 
</configuration> 
</myprogram> 

En este momento me puede mirar en el archivo XML y tratar de leer así:

ifstream in("mydata.xml"); 

//ignore the <?xml line 
in.ignore(200, '\n'); 

//i know that the first value i want is the window height so i can ignore <myprogram> <configuration> and <window> 

//ignore <myprogram> 
in.ignore(200, '\n'); 

//ignore <configuration> 
in.ignore(200, '\n'); 

//ignore <window> 
in.ignore(200, '\n'); 

string s; int height; 

//okay, now i have my height 
in >> s >> height; 

En general esto parece una mala idea y lo que realmente limita cómo se puede modificar el archivo XML. La solución anterior es muy manual y si algo cambia en XML, parece que todo el método de lectura debería cambiarse.

¿Hay una mejor manera de hacerlo?

+0

No he usado C++ en años, así que no puedo nombrar uno, pero google un analizador xml para C++ y estoy seguro de que encontrará algo. – Dan675

Respuesta

6

Usted podría utilizar alguna biblioteca que lo hará por usted. Si está trabajando en la plataforma Windows, puede usar MSXML que ya forma parte del sistema.

Comprobar esta pregunta: Read Write XML File In C++

Otras bibliotecas populares: , ,

+0

Parece que MSXML podría ser lo que estoy buscando. Es un programa de Windows, así que intentaré esto primero. Gracias por el consejo. – user974967

+1

Votación de RapidXml porque es una biblioteca de solo encabezado sin dependencias. –

0

Puede utilizar la biblioteca POCO que tiene funciones para analizar XML

2

impulso árbol de propiedad funciona muy bien con XML, lo que usaría.

+0

No creo que ganes mucho con la biblioteca RapidXml que Boost usa para el árbol de propiedades. A menos que ya esté usando Boost, esto agregaría una gran dependencia en lugar de un único archivo de encabezado (RapidXml). –

+0

de hecho, todo depende de qué bibliotecas las personas ya estén usando y si necesitan compatibilidad multiplataforma – ikku100

1

En fuente multiplataforma, suelo utilizar el lector de Qt XML.

Usted tiene 3 formas de leer:

  1. Qt core QXmlStreamReader - forma Qt de la lectura XML
  2. SAX2 reader - Lector de SAX2 estándar con contenido manejo clase
  3. DOM reader - lector de documentos DOM con nodos XML

Si escribe software solo para Windows, debe usar MSXML 6. Dado que Windows XP SP3 MSXML 6.0 es parte del sistema operativo.

En Linux debe usar libxml2.

+0

¿Por qué debería conformarse con una biblioteca C XML cuando puede tener una C++? – pmr

+0

@pmr: ¿por qué no? En muchos casos, las bibliotecas C puras son más rápidas. libxml2 se usa comúnmente y generalmente está en la máquina, por lo que no hace una dependencia más. – Naszta

+0

En mi experiencia, las bibliotecas C a menudo se sienten raras en C++ idiomático y requieren cierta cantidad de envoltura y no se integran demasiado bien con otros códigos y bases de códigos más grandes. Pero eso es probablemente muy subjetivo. – pmr

1

Necesitará un analizador XML. Hay un montón por ahí:

Mi favorito personal es pugiXML, pero esa es una cuestión de preferencia personal.