Как сопоставить XML-схемы с кодом C/C++?

Каков наилучший способ отобразить схемы XML на C/C++?

Вот пример:

------ 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>

3 ответа

CodeSynthesis XSD - это компилятор XML Schema to C++, который делает в точности то, что вы ищете. Если вам нужна более легкая версия, есть также XSD/e, которая больше ориентирована на разработку для мобильных устройств и встраиваемых систем.

Xerces прекрасно работает как библиотека для извлечения XML-документа. (Вы не сказали, что такое ОС или среда разработки, так что это довольно общий C и C++.)

Оттуда структура / класс для каждого элемента будет хорошим отображением. Если у вас есть много элементов XML для анализа, я бы попытался найти или написать генератор кода, который извлекает XML и выплевывает определения вашего класса или структуры. Как только вы сделаете это правильно один раз, сделать это для любого элемента XML будет просто.

Генерация кода из XML, такого как это, лучше всего достигается с помощью XSLT. Если у вас установлен libxslt, вы можете использовать xsltproc для выполнения преобразования. Сделайте этот шаг перед сборкой в ​​процессе сборки для генерации исходного кода.

Как насчет этого:

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>

Таблица стилей имеет отступ для удобства чтения. но вы захотите удалить некоторые пробелы, чтобы они не появлялись в выводе.

Другие вопросы по тегам