Определить гибкий типизированный элемент в XML-схеме - PullRequest
0 голосов
/ 01 декабря 2009

У меня есть следующий фрагмент XML:

<items>
  <item type="simple">some text</item>
  <item type="complex"><b>other text</b></item>
</items>

Я могу определить элемент item с DTD, как:

<!ELEMENT item (#PCDATA|b)*>

Как я могу определить это с помощью XML Schema (XSD)?

1 Ответ

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

XML-схемы имеют эти абстрактные типы, которые упрощают эту задачу до тех пор, пока префикс xsi в атрибуте type в вашем фактическом XML не беспокоит вас. Вы можете определить, что у вас есть выше, следующим образом:

  <!--items element-->
  <xs:element name="items">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="item" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!--individual item element-->
  <xs:element name="item" type="item" />
  <!--make the item type abstract so you're forced to declare its type in the XML file-->
  <xs:complexType name="item" abstract="true" />

  <!--declare your simple type - mixed content is so that you can have text in a complex type-->
  <xs:complexType name="simple">
    <xs:complexContent mixed="true">
      <xs:extension base="item">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--declare your complex type-->
  <xs:complexType name="complex">
    <xs:complexContent>
      <xs:extension base="item">
       <!--define the stuff that can go into that complex element-->
        <xs:sequence>
           <xs:element name="b" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

И ваш полученный XML будет выглядеть следующим образом:

<items xmlns="your-namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <item xsi:type="simple">some text</item>
  <item xsi:type="complex">
    <b>other text</b>
  </item>
</items>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...