无论XPATH的级别如何,都选择一个XML元素

时间:2011-01-27 09:17:32

标签: xml xpath

我有这个:

<a>
  <b>
    <t>text</t>
  </b>
</a>
<a>
  <t>text</t>
</a>

所以我想选择文本而不管它在哪里。 (请注意,它可以是不仅仅是1/2级别的任何地方,例如它可以没有父母)

这可能吗?

4 个答案:

答案 0 :(得分:24)

您正在寻找the descendant axis

  

descendant轴包含上下文节点的后代;一个   后代是一个孩子或一个孩子   孩子等;因此是后代   axis永远不会包含属性或   命名空间节点

在您的情况下:/descendant:t

当然,正如其他人已经回答的那样,there is an abbreviated syntax for this

  

///descendant-or-self::node()/的缩写。对于   例如,//para是简称   /descendant-or-self::node()/child::para   因此将选择任何para元素   在文档中(甚至是para元素   那是一个文档元素   自//para以来被{{1}}选中   document element节点是一个子节点   根节点)

答案 1 :(得分:20)

您可以使用//从当前节点中选择所有节点。因此//text()将选择所有文本节点。

如果你想要所有t元素,你会//t。如果您想要从某个点开始执行所有t个元素,那么您可以/x/y//t执行此操作。

答案 2 :(得分:7)

如果您想要所有//t代码

,则只需<t>

答案 3 :(得分:1)

W3Schools有很多关于HTML相关的免费课程。 我强烈建议您阅读并制作示例。 http://www.w3schools.com/xsl/xpath_syntax.asp

提示:您可以使用浏览器的控制台来评估表达式。它位于开发者工具 - Chorme和Firefox的F12键下:

$x('<your expressions>');

因此,正如大家所说,您可以使用//语法在页面中的任何位置查找元素。 例如//a会在页面中返回所有 a元素。

很可能你会想要一个特定的,所以,这就是你使用谓词的地方。它们包含在括号内。 以这个页面为例,这是一个xquery:

//a[text()="Simeon"]

此xpath将返回所有具有Simeon文本的a个元素。 在许多情况下,您可能需要改进xpath以包含更多标识符,更具体。

//a[text()="Simeon" AND @href="/users/274344/simeon"]

因此,您几乎可以使用任何HTML属性,甚至CSS来识别您想要的特定节点。

但是现在,让我们把它提升一个档次。 假设您希望从 1月27日获取低于用户 mkimd 答案的a元素。 如果你看一下这个页面结构,你必须得到a并跳回几个级别,直到你能够达到保留发布日期的 span

//a[text()="mkimd" AND ../../div[@class="user-action-time"]/span[contains(.,"Jan")]]

执行这些查询的方法有很多种,我给出的最后一个示例可以使用不同的xqueries来实现。

我发现xqueries与控制台目录中的导航非常相似,如Linux BASH - 相对路径和绝对路径,标识符类似于SQL WHERE子句。

如果您进行研究,XPATH语法中有许多可用的函数,例如

  • 小写()
  • 大写()
  • 的concat()
  • 结束 - 与()
  • 运营商(+-*div!=<<=,{{1 },...)

我强烈建议您使用像 Firefox Firefug FirePath 插件这样的工具来练习xquery并检查您是否获得了所需的元素 - 它会突出显示找到的元素。

====================

编辑 - 5月8日 - 15日

如果您在Selenium自动化中使用Xpath,请知道它不会帮助您选择CSS伪元素。