Как сопоставить XML-схемы с кодом C / C ++? - PullRequest
1 голос
/ 19 декабря 2009

Какой лучший способ отобразить схемы 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 ]

6 голосов
/ 21 декабря 2009

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

2 голосов
/ 19 декабря 2009

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

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

0 голосов
/ 19 декабря 2009

Генерация кода из 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...