【问题标题】:XSD element with undefined contents具有未定义内容的 XSD 元素
【发布时间】:2011-11-30 09:09:24
【问题描述】:

我需要构建一个 XSD 架构来部分验证文件。文件结构为:

<Root>
    <Node name="core">
        <ElementA>String</ElementA>
        <ElementB>String</ElementB>
    </Node>
    <Node name="something unique">
        (any number of elements, with unknown names and types)
    </Node>
</Root>

我的 XSD 类似于:

<xs:element name="Root">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:element name="Node">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" />
                    </xs:sequence>                        
                    <xs:attribute name="name" type="xs:string" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

不完整且不完全正确,未命名的&lt;xs:element&gt;无效。

有几个节点是必需的,每个节点都有一个唯一的名称属性;这就是我想要验证的。名称列表和这些节点的内容是预定义的。

名称未知的节点的内容也是未知的,可以包含任意数量的任意名称和类型的元素,但本身不能有属性或值。

我遇到的问题是允许子元素不知道他们的名字。

有没有可能用 XSD 做这样的事情?有没有办法拥有复杂类型的元素或 anyType 和属性?

编辑: 使用&lt;Node&gt; names 作为元素类型同样可以接受,然后简单地允许其他名称未知的元素。无论哪种方式,我都需要允许具有未知名称和类型的节点。

【问题讨论】:

    标签: xsd


    【解决方案1】:

    要允许“不知道其名称的子元素”,您可以使用 xsd:any;在您的特定(在“设计时”已知)内容之后将其添加为重复粒子。

    <?xml version="1.0" encoding="utf-8"?>
    <!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:element name="Root">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Node">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="ElementA" type="xsd:string" />
                  <xsd:element name="ElementB" type="xsd:string" />
                </xsd:sequence>
                <xsd:attribute name="name" type="xsd:string" use="required" />
              </xsd:complexType>
            </xsd:element>
            <xsd:element name="Extensions" minOccurs="0">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:any maxOccurs="unbounded"     processContents="lax"/>
                    </xsd:sequence>
                    <xsd:anyAttribute processContents="lax"/>
                </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    

    【讨论】:

    • 所以您建议区分必需元素和可选元素?在这种情况下,有两个(或更多)名字?
    • 是的。但是,如果这就是您的意思,则不必将 xsd:any 放在包装器元素下;然而,这是一种相当普遍的模式。我会做的不同的一件事是为 Extensions 元素定义一个全局复杂类型,以允许使用您的架构的人进行自己的重新定义,以防他们想要“强类型”它。我只是想快速向您展示 xsd:any 如何以我理解的方式满足您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多