【问题标题】:XML XSD recursion and namespacesXML XSD 递归和命名空间
【发布时间】:2017-01-24 01:00:20
【问题描述】:

我正试图围绕命名空间和 XSD 中的递归展开思考,但我感到迷茫。

Error: The QName value 'topic' does not resolve to a(n) element declaration

最重要的部分用白线分隔,只是学习 xsd,但我的一项作业需要它,所以请放轻松...

代码(我尝试点击此链接:Recursive element in XML,不幸的是没有结果):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='xmap-content'>
    <xs:complexType>
      <xs:sequence>
        <xs:element name='sheet'>
          <xs:complexType>
            <xs:sequence>

              <xs:element name='topic'>
                <xs:complexType>
                  <xs:sequence minOccurs="0" maxOccurs="unbounded">
                    <xs:element name='title' type='xs:string'/>
                    <xs:element name='children' minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name='topics'>
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element ref='topic' minOccurs="0"
                                            maxOccurs="unbounded"/>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>

            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

最重要的部分是用白线划分的,只是学习xsd,但我的一项任务需要它,所以请放轻松...

【问题讨论】:

    标签: xml recursion xsd namespaces xsd-validation


    【解决方案1】:

    XSD 递归引用元素(无命名空间)

    为了递归地引用topic,它必须被全局定义。您的尝试失败了,因为 topic 是在本地定义的。

    这将起作用:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:element name='xmap-content'>
        <xs:complexType>
          <xs:sequence>
            <xs:element name='sheet'>
              <xs:complexType>
                <xs:sequence>
                  <xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:element name='topic'>
        <xs:complexType>
          <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name='title' type='xs:string'/>
            <xs:element name='children' minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name='topics'>
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    对元素的 XSD 递归引用(带有命名空间)

    您在问题中提到了命名空间,但您包含的 XSD 并未尝试定义命名空间。 (如上所示,您的问题也与命名空间本身无关。)但是,如果您确实需要它们,这里是适用于命名空间的上述 XSD。请注意,您必须定义一个命名空间前缀来引用 xs:schema/targetNamespace 给出的命名空间中的 topic 元素:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:e="http://www.example.com"
               targetNamespace="http://www.example.com">
    
      <xs:element name='xmap-content'>
        <xs:complexType>
          <xs:sequence>
            <xs:element name='sheet'>
              <xs:complexType>
                <xs:sequence>
                  <xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:element name='topic'>
        <xs:complexType>
          <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name='title' type='xs:string'/>
            <xs:element name='children' minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name='topics'>
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
    </xs:schema>
    

    【讨论】:

    • 尴尬,至少没有命名空间。嗯,是的,我确实需要命名空间,只是想从这里开始,你让我的生活变得轻松多了,谢谢。
    • 不客气。不必感到尴尬——诊断信息对于揭示您的 local 定义 topic 不够充分没有多大帮助。我也为您添加了一个使用命名空间的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2012-07-16
    • 1970-01-01
    • 2011-01-07
    • 2020-10-02
    相关资源
    最近更新 更多