代码之家  ›  专栏  ›  技术社区  ›  Gavin

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

  •  7
  • Gavin  · 技术社区  · 17 年前

    您可以根据XML文档验证XPath表达式以进行验证,但是是否有一种简单的方法可以根据XML文档验证相同的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
    

    /RootData/FirstChild/FirstGrandChild
    

    对任何可能基于该模式的XML文档都有效吗?( 编辑 真实的 XML文档可能不包含这些元素,但仍然可以认为XPath对模式可能有效。然而,比如说, /RootData/ClearlyInvalidChild/ThisElementDoesntExistEither 显然是无效的。)

    当然,我只能期望它对规范的XPath表达式而不是任意复杂的表达式起作用,但这很好。

    /xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...
    

    干杯

    2 回复  |  直到 17 年前
        1
  •  6
  •   xcut    17 年前

    实际上,我们在2000年左右做了一个研究项目,并实现了一个XPath验证器。这是针对XPath1的。我不知道目前有任何可用的库可用于执行此操作。

    • 您将无法像上面那样将实例文档上的路径转换为架构上的路径。例如 /a//b 不转化为 /xsd:element[@name='a']//xsd:element[@name='b'] 因为元素b可以在模式的顶层定义,而不是在b下面。

    • 请记住,虽然XML文档是一棵树,但模式是一个图。如果搜索//a这样的子路径,则必须决定何时终止搜索,否则搜索可能会永远继续(例如,在包含“b”的元素“a”中想象,其中包含“a”)

    • //*[starts-with(@name, 'foo')]

    如果您还想使用它,我建议您使用eclipse之类的库 XSD

        2
  •  3
  •   Simon Gibbs    17 年前

    在设计时,您可以使用工具生成示例XML文档,并针对该示例执行XPath。AltovaXMLSpy和SOAPUI都具有此功能。

    SOAPUI实际上是开源(Java)的,所以您可以看看它是如何生成示例的。在运行时情况下(即,如果schema和XPath都是运行程序的输入),则必须确保生成足够的可选组件和示例数据以避免误报,并且可能需要生成多个示例文件。

    我不会试图直接根据模式评估XPath,因为各种轴会使完整的解决方案变得非常复杂。我很确定这是可以做到的,但我觉得这是一门核心数学。我建议作为捷径生成样本。