【问题标题】:How do I define recursive types in XSD?如何在 XSD 中定义递归类型?
【发布时间】:2013-04-22 09:47:22
【问题描述】:

我目前正在与 XSD 进行斗争,这是一种胜利。我正在尝试如下定义一个类型:

 <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.abc.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Condition1" minOccurs="1" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="NOT" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Condition2" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="logicalOperator" name ="NOT" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
....

但是,这给了我一个错误,Visual Studio 下划线 xs:element type="logicalOperator" 并说“命名空间 '' 不能在此架构中引用”。 然后,当我稍后在模式中尝试引用类型“logicalOperator”时,我收到错误“未声明类型logicalOperator”。 我做错了什么?

【问题讨论】:

    标签: xml validation xsd


    【解决方案1】:

    您的架构过于混乱,无法进行精确诊断;假设 XML 命名空间声明正是您所展示的,那么只需将 xmlns="http://www.abc.com/" 添加到您的 元素中,您应该能够引用您在相同的架构文件或具有相同目标命名空间的不同架构文件,使用不带前缀的名称。

    这个sn-p:

    <xs:element type="logicalOperator" .../>
    

    正在尝试查找没有命名空间的 logicalOperator 类型 - 有时打印为 {}logicalOperator

    通过如上所示添加xmlns,则同样变为{http://www.abc.com/}logicalOperator

    说句公道话,XSD 不是唯一一个在这里与你作对的人; XML Namespaces 也是 :)...

    【讨论】:

    • 你是对的。但是你能帮忙吗?一个带有自定义递归类型的简单 xsd 示例会很棒。
    【解决方案2】:

    好的,我搞定了。谢谢佩特鲁。

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.abc.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:abc="http://www.abc.com/">  
       <xs:complexType  name="logicalOperator">
          <xs:sequence>
            <xs:element name="Condition1" minOccurs="1" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="abc:logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="abc:logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="abc:logicalOperator" name ="NOT" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Condition2" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Operator" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="SourceTableValue" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="xs:string" name="ValueToCompareTo" minOccurs="1" maxOccurs="1"/>
                  <xs:element type="abc:logicalOperator" name ="AND" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="abc:logicalOperator" name ="OR" minOccurs="0" maxOccurs="unbounded"/>
                  <xs:element type="abc:logicalOperator" name ="NOT" minOccurs="0" maxOccurs="unbounded" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多