我正面临着XML Schema
的问题。我想将elements
引入另一个被定义为递归的element
。
上面的代码行用于表示文件和文件夹。
这是当前的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="folder_type">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="folder" type="folder_type"></xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
</xs:complexType>
<xs:element name="filefoldertree">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="folder" type="folder_type"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
例如,上面的XSD
代码允许我定义以下XML
行:
<filefoldertree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/C:/Users/Hadi/Desktop/filefoldertree.xsd">
<folder name="a">
<folder name="b">
<folder name="c">
</folder>
</folder>
</folder>
<folder name="d">
</folder>
</filefoldertree>
直到那里,这是一个理想的行为。但是,我想添加一系列file
elements
,嵌套在folder
中。例如,我正在寻找以下结果:
<folder name="a">
<folder name="b">
<file attr1="x" attr2="y" attr3="z"></file>
<folder name="c">
<file attr1="x" attr2="y" attr3="z"></file>
</folder>
</folder>
</folder>
<folder name="d">
<file attr1="x" attr2="y" attr3="z"></file>
</folder>
<file attr1="x" attr2="y" attr3="z"></file>
由于folder
是typed
element
,我无法定义嵌套的complextype
,但我需要它的递归功能。
如何修改XSD
代码以实现上面代码所示的行为?
谢谢您的回答。
您可以在递归类型声明中使用xs:choice
,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="filefoldertree" type="FolderType"/>
<xs:complexType name="FolderType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="folder" type="FolderType"/>
<xs:element name="file" type="FileType"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="FileType">
<xs:sequence/>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
注意:您可能想要命名顶级元素folder
而不是一次性filefoldertree
。