XSD名称未知可选元素与名称已知可选元素

问题描述

| 从逐年发展的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:sequence
xsd:choice
中 我想知道如何使用类似的简单XSD验证原始XML文件     

解决方法

您可以使known1,ѭ2和ѭ7
xs:choice
,并将
maxOccurs
设置为
unbounded
。 编辑:这仍然只处理可选情况,但是我意识到您不必将ѭ6嵌套在ѭ11中。     ,这是一个允许
<known1>
<known2>
元素之间的自由顺序 省略
<known1>
<known2>
(或两者都省略) 在它们之前,之后或之间的任何其他元素的数量不受限制 请注意,必须将“ 16”允许的元素限制为“ 12”或“ 13”以外的其他名称空间。否则,架构将变得明确,因为ѭ16还将允许
<known1>
<known2>
。还要注意的另一件事是,在这里我们有时需要在
<xs:choice>
<xs:sequence>
上设置
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>
    ,简短的答案:使用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>