2009-12-19 4 views
1

Quel est le meilleur moyen de mapper des schémas XML en C/C++?Comment mapper des schémas XML en code C/C++?

est un exemple:

------ C/C++ -----

struct zone { 
     char *var_name; 
     float var_value; 
    }; 

------ ----- XML ​​

<xs:element name="zone"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Var_name" type="xs:string"/> 
      <xs:element name="var_value" type="xs:decimal"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
+0

Je suggérerais de mapper xs: string à une meilleure construction, 'std :: string' si vous utilisez C++ ou un couple' char * 'et' int' si vous voulez une compatibilité C. –

+0

Voulez-vous dire: comment mapper un arbre de syntaxe abstraite C++ à une structure XML? – xtofl

Répondre

2

Xerces fonctionne plutôt bien comme une bibliothèque pour extraire le document XML. (Vous n'avez pas dit quel environnement d'exploitation ou de développement, donc c'est assez générique C et C++.)

De là, un struct/class par élément serait un bon mapping. Si vous avez beaucoup d'éléments XML à analyser, j'essaierais de chercher ou d'écrire un générateur de code pour extraire le XML et cracher vos définitions de classe ou de structure. Une fois que vous l'aurez compris, le faire pour n'importe quel élément XML est un jeu d'enfant.

+0

Merci pour votre réponse. En fait je travaille sur solaris avec gcc et windows xp avec vC++ 6. Comme j'ai deux programmes (l'un fonctionne avec xml et l'autre avec C++), j'essaye de les coupler pour faire des études de simulation. Merci encore pour votre aide, – make

0

La génération de code à partir de XML tel que celui-ci est mieux réalisée en utilisant XSLT. Si vous avez libxslt installé, vous pouvez utiliser xsltproc pour effectuer la transformation. Faites-en une étape de pré-construction dans votre processus de génération pour générer le code source.

Que diriez-vous ceci:

structs.xml

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="zone"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Var_name" type="xs:string"/> 
     <xs:element name="var_value" type="xs:decimal"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="zone2"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Var_name" type="xs:string"/> 
     <xs:element name="var_value" type="xs:decimal"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

makestructs.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/xs:schema/xs:element"> 
struct <xsl:value-of select="@name" /> { 
      <xsl:for-each select="xs:complexType/xs:sequence/xs:element"> 
       <xsl:choose> 
        <xsl:when test="@type = 'xs:string'"> 
    char* 
        </xsl:when> 
        <xsl:when test="@type = 'xs:decimal'"> 
    float 
        </xsl:when> 
       </xsl:choose> 
      <xsl:value-of select="@name" />; 
      </xsl:for-each> 
}; 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

La feuille de style est en retrait pour une meilleure lisibilité. mais vous voudrez supprimer certains espaces pour qu'ils n'apparaissent pas dans la sortie.

+0

merci pour la réponse? alors ho pour mapper le code C/C++? pouvez-vous donner un exemple/merci encore – make

+0

Vous voulez dire que vous avez des définitions de structure C que vous voulez mapper aux schémas XML? La question suggérait l'inverse, alors peut-être devriez-vous clarifier. –

6

CodeSynthesis XSD est un compilateur XML Schema to C++ qui fait exactement ce que vous recherchez. Si vous voulez une version plus légère, il y a aussi XSD/e qui est plus orienté vers le développement mobile/embarqué.

+0

merci beaucoup! c'est génial, je l'essaierais ... merci encore – make