如何在序列中指定“任何元素”

Dav*_*veR 3 xsd xsd-validation

有人能告诉我如何在 XSD 中指定一个元素可以包含任意数量的任意元素吗?例如,如果我有

<person>
    <name>Foo</name>
</person>
Run Code Online (Sandbox Code Playgroud)

我想允许在 " <name>" 元素之后的任何元素。

<person>
    <name>Foo</name>
    <gender>male</gender>
</person>

<person>
    <name>Foo</name>
    <address>west of here</address>
</person>

<person>
    <name>Foo</name>
    <address>west of here</address>
    <spooge>something else</spooge>
</person>
Run Code Online (Sandbox Code Playgroud)

也就是说,name 元素是必需的,但在那之后,您可以添加任何类型的任意元素。因此,如果这是描述<person>元素的 XSD 元素,那么“ <xs:element name='name' .../>”之后会是什么

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

kjh*_*hes 5

您可以使用xsd:any:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           version="1.0">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:any processContents="skip" namespace="##any"
                minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

请特别注意 的可能值processContent:

  • skip:允许任何元素,并忽略该元素的任何定义。
  • lax:允许任何元素,但如果找到任何定义,则验证该元素。
  • strict : 允许任何元素,但要求它有一个定义并且根据该定义是有效的。