仅使用XML Schema 1.0验证子树

问题描述

我有一个关于仅验证XML文档的子树的问题。 考虑以下输入格式:

<root>
  <configurationA>...</configurationA>
  <configurationB>...</configurationB>
  <configurationC>...</configurationC>
  <configurationD>...</configurationD>
</root>

这个想法是在一个大的XML文件中具有多个配置。
每个组件只能解析和验证其自身的配置,并且不需要知道任何信息(甚至不需要标签名称)。

例如对于组件B,理想的是拥有一个如下所示的xsd文件

<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将元素移到其自己的文档中。