xml - 仅使用 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
or定义出现边界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 将元素移动到其自己的文档中。
推荐阅读
- javascript - 对象点符号在 React JSX 中不起作用
- selenium - Selenium 给出 401 Unauthorized 错误
- javascript - 如何在我自己的应用程序中复制此 Instagram 布局?
- javascript - 如何使用 JavaScript “循环”通过元素(显示/隐藏)?
- r - R.使用向量中元素的条件组合创建数据框
- firebase - 从嵌套在 Firestore 和 Flutter 中的数组中的地图中获取数据
- formatting - 如何在 Stata esttab 的 LaTeX 输出表中按模型对回归进行分组
- asp.net-mvc - 在 ViewBag Contents 中的 Select2 中添加和预选值
- leaflet - 单击时如何在 0.5 和 1 之间更改标记的不透明度
- forestplot - 森林图函数中的错误代码:平均值,下限和上限包含无效的列数平均列:3 下限列:上限列: