带有命名空间前缀的xml的xpath表达式

Cha*_*nya 13 xml xpath namespaces prefix xml-namespaces

当xml路径名称空间前缀设置时,我无法获得以下xpath表达式.

/bk:BookStore/bk:Books/bk:Book[text()='Time Machine']

XML是:

<BookStore xmlns:bk="http://www.bookstore.com/book#">
  <bk:Books>
    <bk:Book id="1">Time Machine></bk:Book>
  </bk:Books>
</bk:BookStore>
Run Code Online (Sandbox Code Playgroud)

Ivi*_*ava 29

甚至更好(也更便携),没有不必要的前缀:

/*/*[local-name()='Books'] ... and so on
Run Code Online (Sandbox Code Playgroud)

该函数local-name忽略任何前缀,正如评论者正确指出的那样,前缀可能会有所不同.

  • 为什么有人对此表示反对?我发现这是一种避免处理名称空间的绝佳解决方案,该名称空间在99%的时间中都是令人讨厌且不必要的。 (2认同)
  • 如果命名空间只是你必须克服的一个障碍,是外部强加给你的——就像它们经常发生的那样——那么这绝对是你要走的路。 (2认同)

Dim*_*hev 16

如果没有关于宿主语言的更多信息(您尝试评估XPath表达式),则无法提供有用的建议.

通常,需要使用命名空间管理器"注册"命名空间,这也将前缀与注册的命名空间相关联.然后,使用此NamespaceManager对象作为XPath-evaluation方法的参数,可以将此方法的参数指定为包含前缀为该特定前缀的名称的XPath表达式.

解决方法:

/*/*[name()='bk:Books']/*[name()='bk:Book' and text()='Time Machine']
Run Code Online (Sandbox Code Playgroud)

  • @Ashwin:这个答案显示了如何执行此操作(可能的方法之一),而无需注册命名空间.第二种可能的方法是将命名空间注册到前缀绑定,其中XPath表达式中引用的元素名称是 - 然后XPath表达式可以包含前缀并且更具可读性.第二种方式需要使用命名空间注册实现提供的API,并且需要阅读相应的文档. (2认同)