递归定义元素中的XSD元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归定义元素中的XSD元素相关的知识,希望对你有一定的参考价值。

我正面临着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

以上是关于递归定义元素中的XSD元素的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 XSD 中定义为属性时,自动生成的类中的字段会序列化为元素?

XML, DTD, XSD, SGML

在定义 XML 模式 (XSD) 时“选择”“组”元素是不是有效

从 XSD 生成 XML 中的自定义属性

VSCode自定义代码片段5——HTML元素结构

VSCode自定义代码片段5——HTML元素结构