XML架构:威尼斯式盲人设计和漂亮的列表类型

时间:2013-08-01 09:31:19

标签: xml xsd schema

我正在尝试为以下文档创建XML架构。我想要一个可以包含List s或TextItem s的List元素:

<!-- a "List" containing "TextItem"s: -->

<List>
  <TextItem><TextItemData>foo</TextItemData></TextItem>
  <TextItem><TextItemData>bar</TextItemData></TextItem>
</List>


<!-- a "List" containing "List"s of "TextItem"s: -->

<List>

  <List>
    <TextItem><TextItemData>foo1</TextItemData></TextItem>
    <TextItem><TextItemData>bar1</TextItemData></TextItem>
  </List>

  <List>
    <TextItem><TextItemData>foo2</TextItemData></TextItem>
    <TextItem><TextItemData>bar2</TextItemData></TextItem>
  </List>

</List>

以下XML架构定义完成了任务:

<xs:complexType name="TextItemType">
  <xs:sequence>
    <xs:element name="TextItemData" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="ListType">
  <xs:choice>
    <xs:sequence>
      <xs:element name="TextItem"    type="TextItemType"    minOccurs="0"   maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:element name="List"          type="ListType"        minOccurs="0"   maxOccurs="unbounded"/>
  </xs:choice>
</xs:complexType>

我真正想要的是如下列表(没有TextItemData):

<List>
  <TextItem>foo</TextItem>
  <TextItem>bar</TextItem>
</List>

我可以将TextItem的定义纳入List的定义,以摆脱TextItemData。但是,由于我在示例中省略了属性,TextItem的定义实际上相当复杂。此外,还有其他类型的项目,例如BinaryItemsList的定义会变得难以置信。

如何删除对TextItemData元素的需求?

1 个答案:

答案 0 :(得分:1)

听起来你真正想做的就是:

  <xs:complexType name="TextItemType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="FirstAttribute" />
        <xs:attribute name="SecondAttribute" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:element name="TextItem" type="TextItemType" />

但如果你只是将它用于那一个元素,那么定义TextItemType是不必要的。你可以这样做:

  <xs:element name="TextItem">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="FirstAttribute" />
          <xs:attribute name="SecondAttribute" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>