XPath中的.//和//*有什么区别?

43

在使用Firebug寻找相对XPath时:它创建的XPath格式如下:

  1. .//*[@id='Passwd']---------如果不在开头使用点,它代表什么意思?

  2. 只需在XPath中添加//* -- 它会突出显示--各种页面元素 ---------- 代表什么意思?

以下是Gmail密码字段的XPath。 *的意义是什么?

  • .//*[@id='Passwd']

  • //child::input[@type='password']


1
这对我来说是一个简单的开始:http://www.zvon.org/xxl/XPathTutorial/General/examples.html - SiKing
4个回答

103
这里涉及几个不同的XPath概念:

绝对路径 vs 相对路径 (/ vs .)

  • / 表示绝对位置路径,从文档根开始。
  • . 表示相对位置路径,从上下文节点开始。

命名元素 vs 任意元素 (ename vs *)

  • /ename 选择名为 ename 的根元素。
    • ./ename 选择上下文节点下所有名为 ename 的子元素。
  • /* 选择根元素,无论其名称如何。
    • ./** 选择上下文节点下所有子元素,无论其名称如何。

后代或自身轴 (//*)

  • //ename 选择文档中所有名为 ename 的元素。
    • .//ename 选择上下文节点及其所有下属名为 ename 的元素。
  • //* 选择文档中所有元素,无论其名称如何。
    • .//* 选择上下文节点及其所有下属元素,无论其名称如何。

有了这些概念后,以下是对你特定问题的回答...

  • .//*[@id='Passwd'] 表示选择上下文节点及其所有下属元素中,具有 id 属性值等于 'Passwd' 的元素。
  • //child::input[@type='password'] 可以简化为 //input[@type='password'],表示选择文档中所有类型为密码输入框的 input 元素。
在文档中,需要将type属性值为'password'的内容进行翻译。

14
这个答案应该被接受,因为在我看来它是最准确和完整的。 - Mathias Müller
1
首先感谢您的回答,我将其作为参考并停止使用文档,因为它非常简洁和严格到位。请问您能否指出上下文节点和当前节点之间的区别? - Medi

48

这些表达式都选择不同的节点集:

 

.//*[@id='Passwd']

开头的“.”表示当前处理从当前节点开始。星号选择所有元素节点,这些元素节点是从当前节点开始的,并且具有等于“Passwd”的@id-属性值。

 

如果我们在开头不使用点,它意味着什么?

那么您将选择整个文档中具有等于“Passwd”的@id-属性值的所有元素节点。

 

只需在XPath中添加 //* -- 它会突出显示各种页面元素

这将选择整个文档中的所有元素节点。

 

下面提到的:Gmail密码字段的XPatht是真实的,星号的意义是什么?

.//*[@id='Passwd']

这将选择所有元素节点,它们是当前节点的后代,并且其@id属性值等于“Passwd”。

//child::input[@type='password']

这将选择所有名为input的子元素节点,它们的@type属性值等于“password”。由于默认行为,可以省略child::轴前缀。

有关选择适当表达式的语法,请参见此处在w3school.com上的解释

而坐标轴(处理中的当前点)则在另一个w3school.com页面上解释


4
如有疑问,请查看@kjhughes下面的好回答。 - Mathias Müller
1
非常好,感谢您的编辑。请注意,来自w3schools.com的信息经常不准确,例如“节点”和“元素节点”的混淆可能源于这个不正确的网页。 - Mathias Müller

4
XPath中的点被称为“上下文项表达式”。如果在表达式开头放一个点,它会使它具有上下文特定性。换句话说,它会在调用“按XPath查找元素”的方法的节点上下文中搜索具有id =“Passwd”的元素。 * .//*[@id='Passwd'] 中帮助匹配任何具有id ='Passwd'的元素。

3
  1. 第一个问题: 这完全取决于上下文。您可以查看语法以了解'.'、'..'等表示什么。此外,我敢打赌你不会找到比这个链接更好的解释。
  2. 第二个问题的简化答案: 通常使用html标签如td、a、li、div等来查找节点。但是'*'意味着查找任何匹配给定属性的标签。当您确定某个属性但不确定该元素可能出现在哪个标签中时,它通常被使用,例如我想要一个所有ID为'xyz'的元素列表,无论其出现在哪个标签中。

希望有所帮助 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接