XSD名称 - 具有名称已知可选元素的未知可选元素

问题描述 投票:0回答:3

从以年为基础的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
3个回答
0
投票

你可以制作一个已知的1,2和xs:choicexs:any,并将maxOccurs设置为unbounded

编辑:这仍然只处理可选案例,但我意识到你不必在xs:choice中嵌套xs:sequence


0
投票

这是一个允许的工作模式

  • <known1><known2>元素之间的自由秩序
  • 省略<known1><known2>(或两者)
  • 在它们之前,之后或之间的任何其他元素的无限量

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

<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>

0
投票

简短的回答:使用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>
© www.soinside.com 2019 - 2024. All rights reserved.