XML Schema any 元素学习笔记

什么是 XML Schema any 元素

在 XML Schema 中,any 元素用于表示一个任意的 XML 元素。它可以被用于 Schema 中的 complexType 或者 element 定义中。

任何一个 XML 文档都可以包含任意的元素,而且这些元素往往由第三方提供,那么使用 any 元素就可以在 Schema 中定义出这些未知元素,从而验证 XML 文档的有效性。

any 元素的语法

any 元素有四个主要的属性:

  • namespace: 用于指定元素所属的命名空间。
  • processContents: 用于指定如何处理任意元素(可选),可选值为 laxskipstrict
    • lax: 表示任意元素被视为有效的,但它们必须属于指定的命名空间,并且其子元素也必须满足 Schema 中定义的规则。
    • skip: 表示任意元素被忽略,不进行任何验证。
    • strict: 表示任意元素必须属于指定的命名空间,并且其子元素也必须满足Schema中定义的规则。
  • minOccurs: 表示任意元素最少可以出现的次数,默认为 0。
  • maxOccurs: 表示任意元素最多可以出现的次数,可选值为非负整数或 unbounded,默认为 1。

any 元素的语法如下:

xmlCopy Code
<xs:any namespace="##any | ##other | ##local | ##targetNamespace | List_of_Namespaces" processContents="lax | skip | strict" minOccurs="0 | 1" maxOccurs="1 | xs:unbounded" />

any 元素的使用示例

假设有一个 XML 文档,其中包含不同的笔记类型(note、reminder、task)。此时我们希望定义一个 Schema 来验证这个 XML 文档中的元素是否符合规范,这时候就可以使用 any 元素:

xmlCopy Code
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 先定义三个笔记类型的元素 --> <xs:element name="note" type="xs:string"/> <xs:element name="reminder" type="xs:string"/> <xs:element name="task" type="xs:string"/> <!-- 然后定义一个包含任意元素的复杂类型 --> <xs:complexType name="noteType"> <xs:sequence> <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> </xs:sequence> </xs:complexType> <!-- 最后定义根元素,并指定其类型为 noteType --> <xs:element name="notes" type="noteType"/> </xs:schema>

上面的 XML Schema 中,noteType 表示一个包含任意元素的复杂类型。其中,<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> 表示可以包含任意元素,其出现次数可以是零个或多个,但必须属于正确的命名空间,如果包含了未知的元素也不会出错。

使用上面的 Schema 可以验证以下 XML 文档:

xmlCopy Code
<?xml version="1.0"?> <notes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd"> <note>This is a note.</note> <reminder>Don't forget to buy milk!</reminder> <task>Finish the report by Friday.</task> <other>This element is not defined in the Schema, but it's OK because of the 'lax' processContents attribute.</other> </notes>

其中包含了三个符合定义的元素和一个未知元素,但因为任意元素的 processContents 属性设置为 lax,所以验证通过。

总结

any 元素可以用来表示任意的元素,它可以被用于 Schema 中的 complexType 或者 element 定义中。any 元素的四个主要属性包括:namespaceprocessContentsminOccursmaxOccurs。在使用 any 元素时需要注意其属性的值的取值范围及其对应的含义。