首页 > 解决方案 > 仅使用 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:sequenceor定义出现边界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>

标签: xmlxsdschemalibxml2xsd-validation

解决方案


你可以试试xmlSchemaValidateOneElement。如果这不起作用,您始终可以使用树 API 将元素移动到其自己的文档中。


推荐阅读