2010-10-14 72 views
9

当xml路径名称空间前缀设置时,我无法获得以下xpath表达式。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> 
+0

发布执行XPath查询的代码。 – Tomalak 2010-10-14 09:34:34

+3

您需要将前缀/名称空间URI绑定传递给XPath引擎。为什么?因为前缀对名称测试不重要,但名称空间URI是。所以'a:node'只要'a'和'b'前缀绑定到相同的名称空间URI就可以选择'b:node'。 – 2010-10-14 12:46:49

回答

12

没有关于宿主语言(在你试图计算XPath表达式)它不能够提供有用的建议更多信息。

通常,需要使用名称空间管理器“注册”一个名称空间,这也将一个前缀关联到注册的名称空间。然后,使用此NamespaceManager对象作为XPath评估方法的参数,可以为此方法指定一个包含以该特定前缀为前缀的名称的XPath表达式。

解决方法

/*/*[name()='bk:Books']/*[name()='bk:Book' and text()='Time Machine'] 
+0

我在java中使用xml签名。我想在trasnforms部分使用xpath选择要签名的元素。当我在xml文档中有前缀和名称空间时,如何提供xpath表达式。 – Ashwin 2012-05-22 06:57:48

+1

@Ashwin:这个答案显示了如何做到这一点(其中一种可能的方式),而无需注册名称空间。第二种可能的方法是将名称空间注册为XPath表达式中引用的元素名称的前缀绑定 - 那么XPath表达式可以包含前缀并且更具可读性。第二种方法需要使用名称空间注册实现提供的API,并且需要阅读相应的文档。 – 2012-05-22 12:05:56

24

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

/*/*[local-name()='Books'] ... and so on 

The function local-name忽略任何前缀,如正确地评论者指出,可以变化。

+1

为什么有人不喜欢这个?我发现这是一个很好的解决方案,可以避免处理命名空间,这些命名空间在99%的时间内只是令人讨厌和不必要的。 – Arne 2013-07-31 08:21:38

+0

如果命名空间仅仅是一个障碍,你必须克服你的困难,而这正是他们经常面对的 - 那么这绝对是一条可行的路。 – joachim 2013-10-09 18:45:34

相关问题