【问题标题】:XSD Name-unknown optional elements with name-known optional elementsXSD 名称未知的可选元素和名称已知的可选元素
【发布时间】:2011-05-26 12:40:22
【问题描述】:

从 XSD/XML 的年度演变开始,我想编写一个更简单的 XSD,只针对不会被修改或删除的元素,它可以从完整的 XSD 中验证 XML。

为了简单起见:

使用此 XML:

<root>
    <unknown1/>
    <known2/>
    <unknown2/>
    <known1/>
    <unknown3/>
    <unknown4/>
</root>

还有这个 XSD:

<xsd:schema>
    <xsd:element name="root">
        <xsd:all>
            <xsd:element name="unknown1"  minOccurs="0"/>
            <xsd:element name="unknown2" minOccurs="0"/>
            <xsd:element name="unknown3" minOccurs="0"/>
            <xsd:element name="unknown4" minOccurs="0"/>
            <xsd:element name="known1" minOccurs="0"/>
            <xsd:element name="known2" minOccurs="0"/>
        </xsd:all>
    </xsd:element name="root">
</xsd:schema>

我想做类似的东西:

<xsd:schema>
    <xsd:all>
        <xsd:any processControl="skip" />
        <xsd:element name="known1" />
        <xsd:element name="known2" />
</xsd:schema>

此 XSD 无效,因为 xsd:any 只能出现在 xsd:sequencexsd:choice

我想知道如何使用类似的简单 XSD 验证原始 XML 文件

【问题讨论】:

    标签: xsd


    【解决方案1】:

    您可以将 known1、2 和 xs:any 设为 xs:choice,并将 maxOccurs 设置为 unbounded

    编辑:这仍然只处理可选大小写,但我意识到您不必将xs:choice 嵌套在xs:sequence 中。

    【讨论】:

    • 如果我得到一个没有 know1 和/或 know2 的 XML 怎么办?这将验证,那将是错误的
    • so known1 和 known2 是必需的,但其余的是可选的?标题说“名称未知的可选元素与名称已知的可选元素”所以我很困惑。
    • 抱歉,它们是可选的。对于非可选元素,您会推荐什么?即使使用可选元素,如果我有 known1 和 known2 加上额外的元素(例如 unknown1),那也不会做正确的事情
    • 如果不需要使用 XML Schema,你可以试试 Relax NG,它有 interleavingname class 的概念。
    • 不幸的是,这是一个要求
    【解决方案2】:

    这是一个允许的工作模式

    • &lt;known1&gt;&lt;known2&gt; 元素之间的免费订单
    • 省略 &lt;known1&gt;&lt;known2&gt;(或两者)
    • 在它们之前、之后或之间的任何其他元素的数量不限

    请注意,您必须将&lt;xs:any&gt; 允许的元素限制为除&lt;known1&gt;&lt;known2&gt; 之外的其他命名空间。否则模式将变得明确,因为&lt;xs:any&gt; 也将允许&lt;known1&gt;&lt;known2&gt;。另一件需要注意的是,这里我们有时需要在&lt;xs:choice&gt;&lt;xs:sequence&gt; 上设置minOccurs 属性,以保持架构确定性。

    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
            <xs:choice minOccurs="0">
              <xs:sequence>
                <xs:element name="known1" />
                <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
                <xs:sequence minOccurs="0">
                  <xs:element name="known2" />
                  <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
                </xs:sequence>
              </xs:sequence>
              <xs:sequence>
                <xs:element name="known2" />
                <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
                <xs:sequence minOccurs="0">
                  <xs:element name="known1" />
                  <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
                </xs:sequence>
              </xs:sequence>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    【讨论】:

      【解决方案3】:

      简短的回答:使用 XSD 1.1

      那么你的提议就会奏效。更具体:

      <?xml version="1.0" encoding="UTF-8"?>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
      
          <xs:element name="root" type="root"/>
      
          <xs:complexType name="root">
              <xs:all>
                  <!-- Required -->
                  <xs:element name="known1" type="xs:string"/>
                  <!-- Optional -->
                  <xs:element name="known2" type="xs:string" minOccurs="0"/>
                  <xs:element name="known3" type="xs:string" minOccurs="0"/>
                  <!-- Unknown -->
                  <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
              </xs:all>
          </xs:complexType>
      
      </xs:schema>
      

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多