我有一个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表示它?
答案 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>