如何为复合类型创建架构?

时间:2010-08-21 16:25:21

标签: xml schema

我有一个XML规范,如下所示:

<Root>
    <Directory Name="SomeName">
        <TextFile Name="ExampleDocument.txt>This is the content of my sample text file.</TextFile>
        <Directory Name="SubDirectory">
            <Speech Name="Example Canned Speech">
               ...
            </Speech>
        </Directory>
    </Directory>
</Root>

请注意,Directory元素可以包含其他Directory元素。我如何使用W3C Schema表示它?

2 个答案:

答案 0 :(得分:2)

这应该这样做(你可能想要限制名称而不是xs:string):

<?xml version="1.0" encoding="utf-8"?>
<!-- Remember to change namespace name with your own -->
<xs:schema
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root" type="Container"/>

  <xs:element name="Directory" >
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Container">
          <xs:attribute name="Name" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="TextFile">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="Name" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Container">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="Directory"/>
        <xs:element ref="TextFile"/>
      </xs:choice>
  </xs:complexType>
</xs:schema>

经过测试:

<?xml version="1.0" encoding="utf-8" ?>
<Root xmlns="http://tempuri.org/XMLSchema1.xsd">
  <Directory Name="SomeName">
    <TextFile Name="ExampleDocument.txt">This is the content of my sample text file.</TextFile>
    <Directory Name="SubDirectory">
    </Directory>
    <TextFile Name="hej">

    </TextFile>
  </Directory>
  <TextFile Name="file.txt"/>
</Root>

答案 1 :(得分:2)

您需要创建一个递归<complexType>来表示您的<Directory>类型。鉴于您提供的元素,以下是此技术的示例。

  <xs:complexType name="DirectoryType">
    <xs:sequence>
      <xs:element name="TextFile"/>
      <xs:element name="Speech"/>
      <xs:element name="Directory" type="DirectoryType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Directory" type="DirectoryType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>