Xml XSD可以定义通配符复杂类型吗?

Xml XSD可以定义通配符复杂类型吗?,xml,xsd,Xml,Xsd,假设我不知道一个元素的名称是什么,但我知道它的子元素是什么。例如,未规定名称“foo”和“bar”,但规定名称“A”、“B”和“C” 这也不起作用,只能包含注释并拒绝类型 我可以用名称空间来处理未知的元素名吗?我是否应该放弃,而不是尝试验证子项,而只是记录必须包含的内容?在XML模式中,您无法完全实现您想要做的事情。有一个接近的解决方案,但不完全是您想要的: <xs:element name="example"> <xs:complexType>

假设我不知道一个元素的名称是什么,但我知道它的子元素是什么。例如,未规定名称“foo”和“bar”,但规定名称“A”、“B”和“C”

这也不起作用,
只能包含注释并拒绝类型


我可以用名称空间来处理未知的元素名吗?我是否应该放弃,而不是尝试验证子项,而只是记录必须包含的内容?

在XML模式中,您无法完全实现您想要做的事情。有一个接近的解决方案,但不完全是您想要的:

<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any namespace="##other" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

这就是您所能做的(这是您的“多名称空间”解决方案)。您无法避免完全列出这些元素。如果这还不够好,那么将
processContents
设置为
skip
是您唯一的解决方案,然后是外部验证(代码、Schematron等)

您可以尝试使用:



我不确定这是否允许在不声明类型的情况下添加任意外部元素(通过
xsi:type
属性),但它至少允许描述您要查找的文档类型。

外部验证是我唯一剩下的选项。+1是一个巧妙的技巧。如果我能让过去和未来的每一位开发人员都参与进来,在他们的XML中包含替换,那么这个答案将是成功的,但不幸的是,这是不可能的。如果你想让未来的每一位开发人员都遵守你的模式,那么你就在一场失败的战斗中。我见过人们所说的XML。我看过他们是如何“解析”它的。亲爱的上帝,我已经看到了他们所做的……使用
xsi:type
注释并将解析器置于验证模式(默认情况下通常是关闭的)可能是您唯一的希望。(然后问欧比万。)
<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="A" type="xs:string"/>
                        <xs:element name="B" type="xs:string"/>
                        <xs:element name="C" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:any>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="example">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:any namespace="##other" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="foo">
    <xs:complexType>
        ....
    </xs:complexType>
</xs:element>
<xs:element name="example">
  <xs:sequence>
    <xs:element ref="ABCSequence" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:element>

<xs:element name="ABCSequence" abstract="true" type="ABCSeq" />
<xs:complexType name="ABCSeq">
  <xs:complexContent>
    <xs:sequence>
      <xs:element name="A" type="xsd:string" />
      <xs:element name="B" type="xsd:string" />
      <xs:element name="C" type="xsd:string" />
    </xs:sequence>
  </xs:complexContent>
</xs:complexType>

<xs:element name="foo" substitutionGroup="ABCSequence" type="ABCSeq" />
<xs:element name="bar" substitutionGroup="ABCSequence" type="ABCSeq" />