我正在尝试验证只能读取而不能更改的XML。我知道XML及其结构中可能出现的内容,但不知道会收到什么。其中一些元素与其他元素具有相同的名称,或者完全相同,或者具有不同的类型,等等。
有没有一种方法可以将组从彼此的作用域中删除,或者我必须分离XML,单独验证块,等等?我在下面提供了一个我尝试的例子,以澄清我正在尝试的内容。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="8" minOccurs="8" name="request">
<xs:complexType>
<xs:choice maxOccurs="unbounded" minOccurs="1">
<xs:group ref="group1"/>
<xs:group ref="group2"/>
<xs:group ref="group3"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:group name="group1">
<xs:sequence>
<xs:element name="hello" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:group name="group2">
<xs:sequence>
<xs:element name="hello" minOccurs="0" type="xs:string"/>
<xs:element name="world" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:group name="group3">
<xs:sequence>
<xs:element name="hello" minOccurs="0" type="xs:integer"/>
<xs:element name="world" minOccurs="0" type="xs:boolean"/>
</xs:sequence>
</xs:group>
</xs:schema>
在单个内容模型中不能有具有相同名称但不同类型的元素,在特定情况下为request
。
您可以通过使group1
、group2
和group3
实际上是XML中的元素而不仅仅是XSD中的组来绕过这个约束。
如果您不能更改XML,那么您已经采用了一种不明确的语法,XSD将无法帮助您进行验证,而不进行更一般的验证。例如,您可以使用xsd:any
或将world
概括为一个可以容纳所有情况的简单类型——xs:string
可能会起作用。