[英]Can I validate an XPath expression against an XML schema?
您可以根据 XML 文档验证 XPath 表达式来验证它,但是是否有一种简单的方法可以根据该文档的架构验证相同的 XPath 表达式?
假设我有一个像这样的 XSD 架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc>
<xsd:element name="RootData">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstChild">
<xsd:complexType>
<xsd:sequence minOccurs="0">
<xsd:element name="FirstGrandChild">
... etc etc
是否有一种简单或内置的方法来验证 XPath:
/RootData/FirstChild/FirstGrandChild
对可能基于该模式的任何 XML 文档是否有效? (编辑:我想我的意思是可能有效;实际的 XML 文档可能不包含这些元素,但是 XPath 仍然可以被认为对架构可能有效。而例如/RootData/ClearlyInvalidChild/ThisElementDoesntExistEither
显然是无效的。)
当然,我只能期望这适用于规范的 XPath 表达式,而不是任意复杂的表达式,但这很好。
我特别想在 .NET 但很好奇其他实现是否可以实现。 我想自己动手并不那么重要,例如,我真的不想编写自己的代码来将 XPath 表达式转换为另一个表达式,例如:
/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...
......虽然我知道如果我真的必须这样做,我可以这样做。
干杯!
实际上,我们对此进行了一个研究项目,并在 2000 年左右的某个时候实施了 XPath 验证程序。这是针对 XPath 1 的。我不知道您可以使用任何当前可用的库来执行此操作。
如果你想 go 并自己实现,这里有一些提示:
您将无法像上面那样将实例文档上的路径转换为架构上的路径。 例如, /a//b
不会转换为/xsd:element[@name='a']//xsd:element[@name='b']
因为元素 b 可能定义在架构的顶层,不在 b 之下。
请记住,虽然 XML 文档是树,但模式是图。 如果你搜索像 //a 这样的后代路径,你将不得不决定何时终止搜索,否则它可能会永远继续下去(例如,想象一个包含“b”的元素“a”,其中包含“a”)
有些路径将无法确定或至少很难确定。 例如//*[starts-with(@name, 'foo')]
如果您仍然愿意,我建议使用 eclipse 的XSD或 .NET 模式加载类之类的库将模式加载到 memory 中并检查代码。
在设计时,您可以使用工具生成示例 XML 文档并针对示例执行 XPath。 Altova XML Spy 具有此功能,SOAP UI 也是如此。
SOAP UI 实际上是开源的 (Java),所以也许你可以看看它是如何生成示例的。 在运行时情况下(即如果模式和 XPath 都是运行程序的输入),那么您必须确保生成了足够的可选组件和示例数据以避免误报,并且可能需要生成多个示例文件。
我不会尝试直接针对架构评估 XPath,因为各种轴会使完整的解决方案变得非常复杂。 我很确定这是可以做到的,但它给我的印象是核心数学。 我建议生成样本作为捷径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.