Как я могу смоделировать это в XML-схеме? - PullRequest
1 голос
/ 21 ноября 2011

Я создаю схему для XML, поступающего из внешней системы.У меня проблема с моделированием этого типа:

<main>
...
  <Foo TYPE="Numeric"/>
  <Bar TYPE="Numeric">12.0</Bar>
...
</main>

Я создал тип, расширяющий тип double:

<xs:complexType name="myNumeric">
  <xs:simpleContent>
    <xs:extension base="xs:double">
      <xs:attribute name="TYPE" type="xs:string"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

....

<xs:element name="Foo" type="myNumeric" />
<xs:element name="Bar" type="myNumeric" />

Однако этого недостаточно, когда я пытаюсь проверить схему Iполучил ошибку, сообщающую, что: '' не является допустимым значением для 'double'.

Есть подсказки?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Вы можете создать определенный тип, который представляет собой объединение двух простых типов. Например, «myType» ниже, кажется, отвечает на ваш вопрос:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:my="myNamespace" targetNamespace="myNamespace">
    <xs:simpleType name="myType">
        <xs:union memberTypes="xs:double my:empty"/>
    </xs:simpleType>
    <xs:simpleType name="empty">
        <xs:restriction base="xs:string">
            <xs:length value="0"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>
2 голосов
/ 21 ноября 2011

xs: double не может иметь пустую строку в качестве значения. Если вы хотите пометить этот тип как «нулевой», то вы можете использовать xsi: nil = «true», чтобы указать, что это «пустой» double:

<Foo TYPE="Numeric" xsi:nil="true" />

Чтобы разрешить это, используйте nillable = "true" в вашей схеме

<xs:element name="Foo" type="myNumeric" nillable="true" />

Вам нужно будет включить ссылку на пространство имен экземпляра схемы XML в ваш экземпляр xml.

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ... >
...
</MyRoot>
...