XPath 中的 .// 和 //* 有啥区别?

Posted

技术标签:

【中文标题】XPath 中的 .// 和 //* 有啥区别?【英文标题】:What is the difference between .// and //* in XPath?XPath 中的 .// 和 //* 有什么区别? 【发布时间】:2016-06-07 00:16:59 【问题描述】:

通过 Firebug 查找相对 XPath 时:它像

一样创建

    .//*[@id='Passwd']--------- 如果我们不在开头使用点,它的含义是什么?

    只需在 Xpath 中添加 //* -- 它突出显示 --- 各种页面元素 ---------- 它意味着什么?

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

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

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

【问题讨论】:

这对我来说是一个简单的开始:zvon.org/xxl/XPathTutorial/General/examples.html 【参考方案1】:

这里有几个不同的关键 XPath 概念...

绝对与相对 XPath(/.

/ 引入了一个绝对位置路径,从文档的根目录开始。 . 引入了相对位置路径,从上下文节点开始。

命名元素与任何元素(ename*

/ename 选择一个 ename 根元素 ./ename 选择当前节点的所有ename 子元素。 /* 选择根元素,而不考虑名称。 ./** 选择上下文节点的所有子元素,无论名称如何。

后代或自我轴 (//*)

//ename 选择文档中的所有 ename 元素。 .//ename 选择上下文节点处或下方的所有 ename 元素。 //* 选择文档中的所有元素,无论名称如何。 .//* 选择上下文节点处或下方的所有元素,无论名称如何。

考虑到这些概念,以下是您具体问题的答案...

.//*[@id='Passwd'] 表示选择位于或下方的所有元素 具有id 属性值的当前上下文节点等于 'Passwd'. //child::input[@type='password'] 可以简化为 //input[@type='password'] 表示选择所有 input 元素 在具有等于'password'type 属性值的文档中。

【讨论】:

这个答案应该被接受,因为在我看来它是最准确和最完整的。 首先感谢您的回答,我将其作为参考并停止使用文档,因为它确实简洁且严格。您能否指出上下文节点和当前节点之间的区别?跨度> @Alexander:见Current node vs. Context node in XSLT/XPath?【参考方案2】:

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

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

'.' at the beginning 表示当前处理从当前节点开始。 '*' 选择从当前节点下降的所有元素节点,@id-attribute-value 等于 'Passwd'。

如果我们不在开头使用点,它的含义是什么?

然后,您将选择 whole 文档中 @id-attribute-value 等于“Passwd”的所有元素节点。

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

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

下面提到:XPatht 的 Gmail 密码字段是真的 * 有什么意义?

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

这将选择从当前节点下降的所有元素节点@id-attribute-value 等于'Passwd'。

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

这将选择所有名为 input@type-attribute-values 等于“密码”的子元素节点。 child:: 轴前缀可以省略,因为它是默认行为。

选择适当表达式的语法解释here at w3school.com。

并且解释了轴(当前处理点)here at another w3school.com page。

【讨论】:

如果有疑问,请看下面@kjhughes 的好答案。 现在好多了,感谢编辑。请注意,来自 w3schools.com 的信息通常不准确,例如,“节点”和“元素节点”之间的混淆可能源于此错误网页。【参考方案3】:

XPath 中的点称为“上下文项表达式”。如果您在表达式的开头放置一个点,它将使其特定于上下文。换句话说,它将在您调用“通过 XPath 查找元素”方法的节点的上下文中搜索带有 id="Passwd" 的元素。

.//*[@id='Passwd'] 中的* 有助于将任何元素id='Passwd' 匹配。

【讨论】:

【参考方案4】:
    对于第一个问题:一切都与上下文有关。您可以查看Syntax 以了解“.”、“..”等的含义。另外,我敢打赌,你找不到比 This Link 更好的解释了。 第二个问题的简化答案:您通常会使用 td、a、li、div 等 html 标签找到节点。但“*”表示找到与您给定属性匹配的任何标签。当您确定给定属性但不确定该元素可能附带的标签时,通常使用它,例如假设我想要一个 ID 为“xyz”的所有元素的列表,无论它在任何标签中。

希望对你有帮助:)

【讨论】:

以上是关于XPath 中的 .// 和 //* 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

WinApi中的GetClientRect和GetWindowRect有啥区别?

python中的beautifulsoup和xpath有啥异同点

函数参数中的struct关键字,有啥区别?

JAVA中String s = "hello"和String s = new String("hello")有啥区别啊?

uc/os进中断与进临界区有啥区别?

xpath 路径表达式。node()和*的区别