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有啥异同点
JAVA中String s = "hello"和String s = new String("hello")有啥区别啊?