XSD名称未知可选元素,名称为已知可选元素

XSD名称未知可选元素,名称为已知可选元素,xsd,Xsd,从开发XSD/XML的一年开始,我想编写一个更简单的XSD,只针对不会被修改或删除的元素,它可以从完整的XSD中验证XML 简单来说: 使用此XML: <root> <unknown1/> <known2/> <unknown2/> <known1/> <unknown3/> <unknown4/> </root> 这个XSD: <xsd:s

从开发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文件。您可以对已知的1、2和xs:any进行
xs:choice
,并将
maxOccurs
设置为
unbounded


Edit:这仍然只处理可选的大小写,但我意识到您不必将
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没有know1和/或know2怎么办?这将验证,这将是错误的,因此需要known1和known2,但其余的是可选的?标题是“命名未知可选元素和命名已知可选元素”,所以我很困惑。抱歉,它们是可选的。对于非可选元素,您会推荐什么?即使使用可选元素,如果我有known1&known2加上额外的元素(例如unknown1),那也做不到正确的事情如果使用XML模式不是一个要求,您可以尝试RELAXNG,它有And的概念。不幸的是,这是一个要求