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.
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. –
Voulez-vous dire: comment mapper un arbre de syntaxe abstraite C++ à une structure XML? – xtofl