【问题标题】:Xsd recursion of complexTypescomplexTypes 的 Xsd 递归
【发布时间】:2011-01-30 20:18:12
【问题描述】:

我刚刚学习 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" />

验证器返回的错误是:

“无法将名称‘文件夹’解析为 (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 中的那个,但它似乎已离线...

【问题讨论】:

    标签: xsd xml-validation


    【解决方案1】:

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

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

    【讨论】:

    • 为什么不能使用 ref?
    • 我的回答是元素和类型定义之间的通常引用。我个人没用过 ref,所以不推荐。你看到这个答案了吗:stackoverflow.com/questions/1448888/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多