我可以针对XML模式验证XPath表达式吗?

Gav*_*vin 7 .net xml xpath xsd

您可以针对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
Run Code Online (Sandbox Code Playgroud)

是否有一种简单或内置的方法来验证XPath:

/RootData/FirstChild/FirstGrandChild
Run Code Online (Sandbox Code Playgroud)

对任何可能基于该模式的XML文档有效吗?(编辑:我想我的意思是可能有效 ; 实际的 XML文档可能不包含这些元素,但XPath仍然可能被认为对模式有效.但是,/RootData/ClearlyInvalidChild/ThisElementDoesntExistEither显然无效.)

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

我特别想在.NET中,但我很好奇其他实现是否可行.我想要自己动手并不是那么重要,例如我真的不想编写自己的代码来将XPath表达式转换为另一个,如:

/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...
Run Code Online (Sandbox Code Playgroud)

......虽然我知道如果我真的不得不这样做的话.

干杯!

xcu*_*cut 6

我们实际上做了一个研究项目,并在2000年左右实现了一个XPath验证程序.这是针对XPath 1.我不知道你可以使用任何当前可用的库来执行此操作.

如果你想自己去实现这个,这里有一些提示:

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

  • 请记住,虽然XML文档是树,但架构是图形.如果您搜索像// a这样的后代路径,则必须决定何时终止搜索,或者它可以永久地继续(例如,想象在包含"b"的元素"a"中,其中包含"a")

  • 有些路径是不可判定的,或者至少很难决定.例如//*[starts-with(@name, 'foo')]

如果你仍然愿意,我建议使用像eclipse的XSD或.NET模式加载类这样的库来将模式加载到内存中并进行代码检查.

  • 您的研究项目可能是一个非常有价值的软件。 (2认同)