¿Cuál es la forma más fácil de generar xml en c ++?

He utilizado la serialización de impulso, pero esto no parece permitirme generar xml que se ajuste a un esquema particular, parece que su propósito era simplemente persistir el estado de una clase.

Plataforma: Linux

¿Qué usan ustedes para generar NOT parse xml?

Hasta ahora voy por la ruta de Foredecker de simplemente generarlo yo mismo, no es un documento grande, pero realmente no debería tener tantos problemas para encontrar una biblioteca decente para generarlo correctamente.

En cuanto al impulso, lo que me gustaría hacer es establecer los nombres de los nodos, establecer los atributos en mis nodos y deshacerme de toda la basura extra que viene con eso, ya que realmente no me importa tener que ponerme mi documento de vuelta a esa clase.

Algunos pueden declararme un hereje de XML, pero una manera efectiva es simplemente generarlo con tus herramientas de salida de cadena favoritas (impresión, secuencias de salida, etc.); esto puede ir a un búfer o un archivo.

Una vez guardado, debería validar con un esquema antes de enviarlo y enviarlo.

Para uno de nuestros proyectos, tenemos un conjunto muy simple de plantillas para administrar tags y atributos de inicio / finalización. Estos tienen un operador de salida de flujo. Esto hace que sea muy fácil generar el origen XML y la depuración. Esto hace que la estructura del código de generación XML se parezca mucho al XML en sí.

Una ventaja de esto es que puede generar grandes cantidades de XML de manera eficiente si se transmite a un archivo. Pagará los costos de validación más tarde (presumiblemente en un mejor momento para una operación costosa).

La desventaja de esta técnica es que es esencialmente solo de salida. No es adecuado para crear y luego consumir XML dinámicamente.

Recientemente revisé un grupo de bibliotecas XML específicamente para generar código XML.

Resumen ejecutivo: elegí ir con TinyXML ++ .

TinyXML ++ tiene syntax decente de C ++, está construido en las librerías TinyXML C maduras, es de código abierto y gratuito (licencia MIT) y es pequeño. En resumen, ayuda a hacer el trabajo rápidamente. Aquí hay un fragmento rápido:

Document doc; Node* root(doc.InsertEndChild(Element("RootNode"))); Element measurements("measurements"); Element tbr("TotalBytesReceived", 12); measurements.InsertEndChild(tbr); root->InsertEndChild(measurements); 

Que produce:

   12   

He estado bastante feliz con eso.

Revisé muchos otros; aquí están algunos de los mejores contendientes:

Xerces : El rey papi. Hace todo (especialmente cuando se combina con Xalan ) pero es pesado y obliga a la administración de la memoria al usuario.

RapidXML : ideal para el análisis sintáctico (es un analizador in situ y es rápido ), pero no es bueno para la generación, ya que agregar nodos al DOM requiere administración de memoria.

Boost.XML (propuesta): se ve genial : syntax poderosa y excelente de C ++. Sin embargo, aún no ha pasado por el proceso de revisión, no es compatible y la interfaz puede cambiar. Casi lo usé de todos modos. Esperando su aceptación en Boost.

Libxml ( ++ ): muy bueno; syntax decente y decente Pero es muy grande si todo lo que hace es generar XML y está vinculado a la biblioteca glibmm (para ustring). Si solo estuviéramos en Linux (¿como usted?) Lo consideraría seriamente.

XiMOL : biblioteca única basada en secuencias. Esto fue un poco demasiado simplista para nuestras necesidades, pero para la generación básica de XML, puede que le resulte bastante útil. La syntax de la secuencia es bastante clara.

¡Afortunadamente hay algo allí de algún uso!

Boost.PropertyTree es una forma sencilla y directa de generar XML, especialmente si ya está utilizando Boost.

El siguiente es un progtwig de ejemplo completo:

 #include  #include  using boost::property_tree::ptree; using boost::property_tree::write_xml; using boost::property_tree::xml_writer_settings; int wmain(int argc, wchar_t* argv[]) { char* titles[] = {"And Then There Were None", "Android Games", "The Lord of the Rings"}; ptree tree; tree.add("library..version", "1.0"); for (int i = 0; i < 3; i++) { ptree& book = tree.add("library.books.book", ""); book.add("title", titles[i]); book.add(".id", i); book.add("pageCount", (i+1) * 234); } // Note that starting with Boost 1.56, the template argument must be std::string // instead of char write_xml("C:\\Users\\Daniel\\Desktop\\test.xml", tree, std::locale(), xml_writer_settings(' ', 4)); return 0; } 

El XML resultante se ve así:

     And Then There Were None 234   Android Games 468   The Lord of the Rings 702    

Una cosa que es particularmente agradable son los caminos separados por puntos que te permiten crear implícitamente todos los nodos en el camino. La documentación es bastante pobre, pero junto con ptree.hpp debería darle una idea de cómo funciona.

¿Cual plataforma? MSXML es una opción en Windows. CMarkup es otra buena opción. Si .NET es una opción, tiene una excelente compatibilidad con XML.

En realidad, no he intentado boost la serialización para hacerlo, pero según tengo entendido, si selecciona cuidadosamente sus opciones, puede establecer muchas opciones diferentes en el esquema (como evitar el sobrepeso del puntero y configurar los nombres de los elementos para ciertos tipos). )

uso tinyXml ++ y hace que sea muy fácil crear xml como se publicó anteriormente. También lo guardará en un archivo en un comando pero no puedo encontrar la manera de guardarlo en un buffer.