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> 

由于 foldertyped 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