繁体   English   中英

我可以根据 XML 模式验证 XPath 表达式吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM