Является ли xs: choice эквивалентом перечисления C ++? - PullRequest
3 голосов
/ 17 июня 2009

Мы выполняем сериализацию с помощью MS XML 4. Когда мы сериализуем перечисления C ++, мы используем таблицу для перевода каждого возможного значения в строку, и они сохраняют эту строку как значение атрибута. Когда мы производим десериализацию, мы читаем это значение атрибута, сравниваем его со всеми элементами в таблице и получаем соответствующее значение перечисления. Если мы не можем найти, мы выдаем ошибку.

Чтобы облегчить создание XML внешними программами, мы опубликовали схемы XML для всех типов данных, представляющих интерес. Атрибуты для перечислений определяются следующим образом:

<xs:complexType>
    //other fields here
    <xs:attribute name="Color" type="xs:string"></xs:attribute>
</xs:complexType>

Работает, но не содержит определений возможных строковых значений. Как я могу добавить возможные значения к этому определению? Использую ли я xs: choice для этого?

Ответы [ 2 ]

3 голосов
/ 17 июня 2009

Нет, xs:choice предоставляет схеме информацию, которая гласит: «В этом месте вы можете иметь то или это или это, но не комбинацию»; Вы можете узнать больше о xs:choice здесь .

Чтобы создать перечисление, вы должны определить его как часть ограниченного типа на основе xs:string.

Например:

<xs:simpleType name="ColorType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="white"/>
    <xs:enumeration value="black"/>
    <xs:enumeration value="blue"/>
  </xs:restriction>
</xs:simpleType>

Затем вы можете использовать этот тип, как и любой другой:

<xs:complexType>
  <xs:attribute name="Color" type="ColorType" />
</xs:complexType>

Для получения дополнительной информации о с использованием xs:restriction и других элементов и атрибутов XSD, ознакомьтесь с www.w3schools.com . У них есть хорошие справочные руководства и учебные пособия по многим темам, связанным с сетью, таким как XHTML, XSLT, XPath и XSD (а также javascript и AJAX).

0 голосов
/ 17 июня 2009
<xs:complexType>
  //other fields here
  <xs:attribute name="Color">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="RED"/>
        <xs:enumeration value="BLUE"/>
        <xs:enumeration value="GREEN"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
</xs:complexType>

Вы также можете создать его как внешний тип:

<xs:complexType>
  //other fields here
  <xs:attribute name="Color" type="Color"/>
</xs:complexType>
<xs:simpleType name="Color">
  <xs:restriction base="xs:string">
    <xs:enumeration value="RED"/>
    <xs:enumeration value="BLUE"/>
    <xs:enumeration value="GREEN"/>
  </xs:restriction>
</xs:simpleType>

<xs:choice> означает что-то совсем другое. Имена в XML-схеме не интуитивны и несколько вводят в заблуждение. Выбор означает один из содержащихся элементов.

...