2010-09-16 24 views
9

Soy nuevo en programación y me gustaría saber si es posible convertir un nodo XML en una Estructura C++. Por ejemplo tengo un archivo con el siguiente código XML:Cómo convertir un nodo XML a una estructura C++?

<?xml version="1.0" encoding="utf-8"?> 
<StrucDescription> 
    <StrucName> 
    <unStrucNameMember1 type="uint16">0</unStrucNameMember1> 
    <unStrucNameMember2 type="uint8">0</unStrucNameMember2> 
    <ulStrucNameMember3 type="int32">0</ulStrucNameMember3> 
    <bStrucNameMember4 type="bool">true</bStrucNameMember4> 
    <szStrucNameMember5 type="char" size="32"></szStrucNameMember5> 
    </StrucName> 
</StrucDescription> 

¿Es posible crear la estructura de abajo para futuras almacenamiento de datos del XML anterior?

struct StrucName 
{ 
    uint16 unStrucNameMember1; 
    uint8 unStrucNameMember2; 
    int32 ulStrucNameMember3; 
    bool bStrucNameMember4; 
    char szStrucNameMember5[32]; 

    StrucName() 
    : unStrucNameMember1(0) 
    , unStrucNameMember2(0) 
    , ulStrucNameMember3(0) 
    , bStrucNameMember4(true) 
    , szStrucNameMember5() 
}; 

Gracias a todos por las respuestas.

+0

¿Quiere decir una vez? ¿O leer programáticamente en el xml y crear dinámicamente esa estructura? – Salgar

Respuesta

2

Si conoce el tipo de la estructura en tiempo de compilación, puede usar un XML-parser. No hay forma de que C++ cree dinámicamente un tipo (struct en su caso) en tiempo de ejecución. Si desea generar código para trabajar más tarde con un esquema XML, this puede ser lo que está buscando.

4

Este es el trabajo de XML Parsers. Un buen analizador xml que es fácil de configurar es Tiny XML.

2

C++ no tiene utilidades nativas de análisis de XML. Tendrás que obtener una biblioteca externa, como Xerces, para eso.

-2

Sí, es posible. Le sugiero que vuelva a seleccionar su pregunta para ruby, python y/o perl, ya que todos tendrán una biblioteca de análisis XML adecuada para leer su definición XML, y probablemente será más fácil comenzar rápidamente que el rendimiento más alto, pero típicamente pesados ​​equivalentes de C++. Revisa las definiciones de estructura y utiliza un bucle interno para los campos, imprimiendo el código C++ que desea generar. Si desea usar C++, puede probar libxml2 o xerces.

+0

Nunca popular entre los programadores de C++ oye :-). –

1

Si su documento XML sigue un esquema XSD, puede usar gSOAP para generar C/C++ struct s desde el XSD y convertir entre estas estructuras y documentos XML. (Aunque esta herramienta está pensada para su uso con SOAP, esto se puede hacer de forma independiente al uso de SOAP).

+0

La generación "mixta C/C++" me asusta un poco. No hay lenguaje C/C++, entonces, ¿qué genera? –

+0

@ Matthieu M., disculpe la ambigüedad. Depende de la bandera que use, con '-c' las herramientas generan C, de lo contrario C++ (más detalles en las páginas man para' wsdl2h' y 'soapcpp2'). – Bruno

+0

Gracias, cuando probé la generación en línea, solo vi C y me pregunté si simplemente harían que el código cumpliera con C y C++ ... lo cual es posible, pero es una terrible interfaz para C++. –

0

AFAIK, No puede, con C++, crear una estructura de forma dinámica.

Deberá definir su estructura de acuerdo con el formato del archivo XML; Normalmente, tales cosas se hacen en el momento del diseño.

M.

6

Creación de construcciones del lenguaje de programación para los documentos XML se llama XML data binding. Si desea hacer esto en (antes) tiempo de compilación, busque en google C++ xml data binding. La herramienta más prometedora que he visto hasta ahora es XSD from Codesynthesis. Está disponible como versión GPLed. (Tenga en cuenta que necesita un esquema XML que describa su archivo.)

Si desea hacer esto en tiempo de ejecución (dinámicamente) para estructuras XML arbitrarias, esto no es posible. Como usted escribe que es "nuevo en la programación", le sugiero comenzar con un libro para principiantes en C++ y se volverá aparente rápidamente por qué no es posible: usted (o una herramienta) escribe el código fuente de la estructura y su uso. Para hacer referencia a su StrucName mediante este apodo, debe saber en el momento en que escribe el código (es decir, en tiempo de compilación) que tiene una etiqueta XML con este nombre. Si solo conocía el diseño XML y su nombre en tiempo de ejecución, no puede hacer referencia a estos apodos en su código fuente ya que aún no se conocen.

0

Lo que está pidiendo generando dinámicamente las estructuras es imposible.

En C++, la estructura debe conocerse en tiempo de compilación. Hay herramientas de generación de código que pueden leer archivos XSD y generar las estructuras para usted. Luego puede integrarlo en su código.

Dicha generación de código es común, y en general es parte del proceso de compilación, por lo que siempre que la descripción del esquema cambie, las estructuras se regenerarán.

Sin embargo, si desea analizar un xml arbitrario, no puede tener un enlace tan fácil porque las estructuras/clases de C++ no evolucionan en el tiempo de ejecución.

Sin embargo, puede tener clases genéricas, la unión de los datos en los campos, que es lo que esencialmente DOM analizadores cuentan:

  • TinyXML
  • Xerces
  • ...

Por último, si desea estructuras generadas dinámicamente a partir de archivos xml, necesitará lenguajes dinámicos como Python o Ruby, que soportan la adición/eliminación de atributos de un objeto en tiempo de ejecución. Si el rendimiento no es un problema, esto podría ser mucho más fácil.

Además, los intérpretes se envían generalmente con una buena cantidad de bibliotecas bien documentadas, entre las que se encuentran los analizadores Xml y Json.

0

Si tiene un XSD que describe sus tipos de XML, hay productos que pueden generar clases de C++ que puede usar para leer en su documento y luego tener una API para acceder y modificar el documento. Uno de los mejores productos comerciales que puede hacer esto es HydraExpress by Rogue Wave Software. Este tipo de software generará el código C++ que puede compilar y vincular con su programa. A menudo va a tener un mejor rendimiento que las interfaces generadas en lenguajes que admiten la creación de reflejos y objetos dinámicos.

Una exención de responsabilidad, soy un desarrollador del software HydraExpress. Si necesita una solución gratuita, existen otras opciones que pueden satisfacer sus necesidades y le recomiendo que pruebe algunas para encontrar la que mejor se adapte a sus necesidades. En mi opinión sesgada, HydraExpress es una buena opción si necesita rendimiento, soporte de nivel comercial y una solución más fácil de usar que otros productos gratuitos similares. Cuesta dinero, pero hay una versión de prueba que se puede descargar desde el sitio web.

Cuestiones relacionadas