/ *而不是XPath选择器谓词中的*

时间:2013-08-01 03:10:51

标签: xpath

我之前在某地读过,但我现在无法解释这个问题,所以如果有人能指出我正确的方向,我将不胜感激。

我正在为HTML文档创建规范XPath的XPath选择器。下面是一个简单的例子(包含在HTMLUnit中,它在后台使用xalan,但可以是任何XPath处理器)。

如果我跑:

WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[*]/text()"));

我收到[]回复。但是,如果我改为运行(注意a [*] vs a [/ *]:

WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[/*]/text()"));

我将[开发者部分]作为回应。

可以在位置谓词中添加通配符作为参数(即[*])。但是,对于某些节点/标签(我特别注意到文本节点为h1,h2 ......,p,b,强,并且其他一些html标签为li或ul)有时在通配符之前需要斜杠(即[/ *])获得结果。

有人可以提供这是什么意思的背景吗?我无法在网络或XPath规范中找到对此的引用。

2 个答案:

答案 0 :(得分:1)

如果您使用“通配符”的意图只是选择路径a下发生的任何/html/body/footer/div/div/div[2]/div[4]/ul/li[2],那么您根本不需要谓词。你可以这样做:

/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a

这将选择所有 a元素,这些元素是路径/html/body/footer/div/div/div[2]/div[4]/ul/li[2]的子元素。

答案 1 :(得分:0)

你想做什么?你在上使用谓词是什么?

据我所知,a[*]正在选择a带有子节点元素(请参阅注释 - 谢谢),因此没有子元素(因为没有子元素)同样适用于h1h2 ...,pb)。

相比之下,a[/*]正在选择根目录下的任何a(更准确地说,在任何有根的文档中 - 再次,请参阅注释)。这适用于所有节点,但完全没有意义。

我认为你应该使用/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a/text()

[update:]路径可以“模糊”,匹配多个东西,并返回一组结果。你不需要做任何特殊的事情(比如使用[*])来做这件事。 [...]所做的就是添加其他约束。它使更多具体。你不需要任何东西来使事情变得不那么具体 - 默认是尽可能一般。