复杂类型的Xsd递归

时间:2010-03-23 14:52:02

标签: xsd xml-validation

我正在学习XML / XSD,并且正在努力实现模拟文件夹结构的XML模式。 我想到的是为文件夹定义complexType,该文件夹可以包含表示子文件夹的其他文件夹实例。使用xsd架构验证器here始终返回架构无效。

我尝试在前面定义complexType,然后使用 ref 关键字来存储子文件夹:

<xs:complexType name="tFolder">
 <xs:sequence>
  <xs:element name="Path" type="tFolderType" msdata:Ordinal="0" />                    
  <xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />
  <xs:element name="File" nillable="true" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
      <xs:simpleContent msdata:ColumnName="File_Text" msdata:Ordinal="0">
        <xs:extension base="xs:string">
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>                              
 </xs:sequence>
<xs:attribute name="Type" type="tFolderType" />

至于元素本身:

<xs:element name="Folder" type="tFolder" />

验证器返回的错误是:

“无法将名称'Folder'解析为(n)'元素声明'组件。”

并且错误发生在

<xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />

在元素本身内定义complexType会产生完全相同的错误:

<xs:element name="Folder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Path" type="tFolderType" msdata:Ordinal="0" />
      <xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />                          
      <xs:element name="File" nillable="true" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent msdata:ColumnName="File_Text" msdata:Ordinal="0">
            <xs:extension base="xs:string">
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>                              
    </xs:sequence>
    <xs:attribute name="Type" type="tFolderType" />
  </xs:complexType>
</xs:element>

我读过的,这种递归应该可以使用 ref

谁能告诉我我做错了什么?也许xsd验证器只是有缺陷?如果是这样,有没有人知道更好的选择?我也尝试过使用w3.org中的那个,但它似乎已经脱机了......

1 个答案:

答案 0 :(得分:2)

我认为这是做到这一点的方法(不要使用ref):

<element name="test" type="tns:TestType"></element>

<complexType name="TestType">
    <sequence>
        <element name="test" type="tns:TestType"></element>
    </sequence>
</complexType>