XSD 个递归定义元素内的元素
XSD elements inside a recursive defined element
我遇到了 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
。
我遇到了 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
。