2009-01-29 13 views
9

En mi proyecto hay situaciones donde tenemos que enviar mensajes xml (como char *) entre módulos. No son realmente grandes, solo 10-15 líneas. En este momento, todos solo crean la cadena ellos mismos. No creo que este sea el enfoque correcto. Ya estamos usando xerces DOM library. Entonces, ¿por qué no crear un árbol Dom, serializarlo y luego enviarlo?Creando XML en C++ Código

¿Qué es lo que ustedes chicos sugieren?

Respuesta

6

Si realmente solo está creando pequeños mensajes XML, Xerces es una exageración, en mi humilde opinión. Es una biblioteca de analizador y no está analizando nada.

+2

Estoy muy en desacuerdo. Crear el XML a mano es bastante propenso a errores (problemas de codificación, escape de caracteres), así que recomiendo crear un árbol (DOM o algo más) y luego serializarlo. – bortzmeyer

+1

Oye, acabo de decir "Xerces es una exageración". El escape puede (y debe) ser manejado por una sola función o una biblioteca liviana como Genx: http://www.tbray.org/ongoing/genx/docs/Guide.html - Nemanja Trifunovic –

1

métricas

comparan el tiempo que tarda la creación manual de la cadena de una docena de veces o así, luego comparar el tiempo que tarda con la biblioteca.

Si los miembros de su equipo son como los míos, cambiarán rápidamente su tono.

además, el factor de control de calidad en el tiempo si se codifican mal, etc ...

utilizan la biblioteca lo más que pueda.

2

Sugiero crear el árbol DOM. No tendrá que preocuparse por escapar de los caracteres XML en sus datos. Si un desarrollador se olvida una vez, puede recibir una entrada del usuario que hace que su salida XML sea incorrecta.

0

Solo usaría el árbol DOM. De esta forma, no es necesario analizar los datos de ida y vuelta al enviar y recibir las cadenas xml.

--- Un poco fuera de tema: Para otras personas justo pasando con este post y por casualidad uso de la necesidad de un marco XML DOM ultraligera éste: http://www.applied-mathematics.net/tools/xmlParser.html

Es muy fácil de usar, y se compone de 2 archivos.

1

Tuve el mismo problema al querer pasar mensajes xml entre dispositivos integrados.

Escribí lo siguiente (todo en un archivo de encabezado) para ser una api rápida para analizar y generar xml. No es compatible con todas las características de XML, pero los mensajes XML más simples no necesitan de todos modos:

http://www.scottlangham.co.uk/2009/01/rapidxml-a-quick-xml-parsergenerator-for-c/

Hay uso de ejemplo que se muestra en los comentarios.

Para escribir XML que puede hacer algo como lo siguiente:

int isbn = 2938237; 
wstring authorName = "Isaac Asimov"; 
wstring borrower = "Mr. Blobby"; 

CWTag bookTag = libraryTag(L"Book") 
    (L"author",authorName) (L"isbn",isbn) (L"borrower",borrower); 
bookTag(L"Review") (L"comments", L"very good"); 

y esto da lugar a la nueva xml que se añade bajo la etiqueta:

<Book author="Isaac Asimov" isbn="2938237" borrower="Mr. Blobby"> 
    <Review comments="very good"/> 
</Book> 

Nosotros probamos otra biblioteca, que pueda No recuerdo cuál, y descubrí que no fue lo suficientemente rápido. No queríamos pegarnos con el formato manual de las cadenas porque estábamos lidiando con muchos mensajes.

3

Puede usar el DOM o escribir su propio marco de generación de XML pequeño de C++.

Los Xerces API fue portado desde Java y mediante el uso de alcance objeto que puede hacer que la generación de XML del código C++ aún más fácil:

XmlWriter w; 
Elem book = w.Element("book"); 
book.addAttrib("title", "Lord of the Rings"); 
Elem author = e.addChild("author"); 
author.addAttrib("age", 43); 
author.addText("Tolkien"); 

Esto daría como resultado el siguiente código XML:

<book title="Lord of the Rings"> 
    <author age="43">Tolkien</author> 
</book> 
0

Si Está creando un archivo XML de tamaño medio a grande, necesitará una biblioteca para ayudarlo. Si está creando un archivo XML pequeño a muy pequeño, también podría simplemente transmitir el texto en él.

astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>" 

es casi tan fácil como se puede llegar a ese fragmento XML tamaño, si los archivos XML son de ese tamaño, puede ser que también acaba de ellos construye de esta manera - no trate de complicar las cosas sólo para algunos ideal purista que en realidad no te ayuda.

Al igual que la optimización, nunca debe cambiar las cosas sin medir el efecto que tendría. Aquí, si su código es mantenible como está, quédese con él. Solo intente cambiarlo cuando haya medido su capacidad de mantenimiento (es decir, haya notado que es incómodo actualizar los XML) y haya descubierto que tarda demasiado en ser cómodo.

+0

, siempre que el programador sepa cómo para tratar con caracteres como '<' and '>' y '&' en los elementos xml, y también en unicode. – jdkoftinoff

2

Crear XML a mano es una de las formas más seguras de locura que conozco. Eventualmente, alguien arruinará una entidad en algún lugar, o se dejará un soporte posterior, o algo así ... solo use una biblioteca. GenX sería mi elección.

Editar: Leyeron mal tu publicación. Si ya tiene una biblioteca de generación, úselo. No compliques las cosas innecesariamente si puedes evitarlo.

0

De hecho, uso CMarkup de FirstObject.com.

CodeProject tiene una distribución y textual mayor tutorial (http://www.codeproject.com/KB/cpp/markupclass.aspx)

distribuciones de código fuente están disponibles y el componente viene en varios sabores (desarrollador, desarrollador Avanzada) a través de la página (s) firstObject descarga.

El sitio web FirstObject contiene muchos ejemplos útiles e incluso distribuyen un Free XML Editor.

No No soy un empleado pero soy un propietario satisfecho del componente.

3

rápida y fácil, tratar API TinyXML:
http://www.grinninglizard.com/tinyxml/

+0

Para corroborar su calidad, consulte quién está presente en el SDK de Adobe. busque en \ sdk91_v1_win \ Adobe \ Acrobat 9 SDK \ Versión 1 \ NonAdobeSupport \ TinyXML (http://download.macromedia.com/pub/developer/acrobat/sdk/9/sdk91_v1_win.zip) – lsalamon