问题描述
我有一个关于仅验证XML文档的子树的问题。 考虑以下输入格式:
<root>
<configurationA>...</configurationA>
<configurationB>...</configurationB>
<configurationC>...</configurationC>
<configurationD>...</configurationD>
</root>
这个想法是在一个大的XML文件中具有多个配置。
每个组件只能解析和验证其自身的配置,并且不需要知道任何信息(甚至不需要标签的名称)。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
<xs:element name="configurationB" type="ConfigurationType" minOccurs="1" maxOccurs="1"/>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
不幸的是,由于这些元素的含糊不清,这是行不通的。
我还尝试为xs:sequence
定义出现范围,或改用xs:choice
-在每种情况下,我都会从在线验证程序中收到这样的错误。
Cos-nonambig:ConfigurationB和WC [## any](或来自其替换组的元素)违反了“唯一粒子归因”。在针对该架构进行验证的过程中,将为这两个粒子创建歧义。
我听说有XML Schema 1.1的解决方案,但是我正在从事的项目当前在C ++中使用libxml2,它仅支持Schema版本1.0。 当前无法更改解析器。
是否有解决方案可用于实现这一目标?
其他示例进一步描述了组件B的XSD应该能够匹配什么:
<root>
<configurationB>...</configurationB> <!-- config for B available exactly once -->
</root>
<root>
<configurationA>...</configurationA>
<configurationB>...</configurationB> <!-- config for B available exactly once -->
</root>
<root>
<configurationC>...</configurationC>
<configurationB>...</configurationB> <!-- config for B available exactly once -->
</root>
<root>
<configurationB>...</configurationB> <!-- config for B available exactly once -->
<configurationA>...</configurationA>
</root>
以下示例应失败:
<root>
<!-- missing config for B -->
</root>
<root>
<configurationA>...</configurationA>
<!-- missing config for B -->
<configurationC>...</configurationC>
</root>
<root>
<configurationB>...</configurationB>
<configurationB>...</configurationB> <!-- duplicate config for B -->
</root>
解决方法
您可以尝试xmlSchemaValidateOneElement
。如果这不起作用,则始终可以使用树API将元素移到其自己的文档中。