*/ 在 XPath 中是啥意思?
Posted
技术标签:
【中文标题】*/ 在 XPath 中是啥意思?【英文标题】:What does */ mean in XPath?*/ 在 XPath 中是什么意思? 【发布时间】:2021-12-10 15:36:51 【问题描述】:为什么我的 XPath,
//android.view.ViewGroup[*/android.widget.TextView[@androidXtext='Microwaves']]
选择这个节点,
<android.view.ViewGroup androidXclickable="true" androidXcontentDescription="ucl.flex-row" androidXenabled="true" androidXfocusable="true" androidXid="@ucl.flex-row" androidXlayout_ androidXlayout_ androidXlayout_x="11px" androidXlayout_y="913px">`
上面或下面没有其他的?
完整片段:
<android.view.ViewGroup androidXenabled="true" androidXlayout_ androidXlayout_ androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXclickable="true" androidXcontentDescription="ucl.flex-row" androidXenabled="true" androidXfocusable="true" androidXid="@ucl.flex-row" androidXlayout_ androidXlayout_ androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_ androidXlayout_ androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXcontentDescription="ucl.flex-row.left-action.svg" androidXenabled="true" androidXid="@ucl.flex-row.left-action.svg" androidXlayout_ androidXlayout_ androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_ androidXlayout_ androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_ androidXlayout_ androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_ androidXlayout_ androidXlayout_x="53px" androidXlayout_y="955px"/>
</android.view.ViewGroup>
</android.view.ViewGroup>
</android.view.ViewGroup>
<android.widget.TextView androidXcontentDescription="ucl.flex-row.main.text" androidXenabled="true" androidXid="@ucl.flex-row.main.text" androidXlayout_ androidXlayout_ androidXlayout_x="137px" androidXlayout_y="960px" androidXtext="Microwaves"/>
</android.view.ViewGroup>
</android.view.ViewGroup>
</android.view.ViewGroup>
【问题讨论】:
【参考方案1】:XPath 默认的axis 是child
,所以你的谓词
[*/android.widget.TextView[@androidXtext='Microwaves']]
等价于
[child::*/child::android.widget.TextView[@androidXtext='Microwaves']]
此谓词将选择具有android.widget.TextView
孙子和指定属性的节点。
【讨论】:
【参考方案2】:这里有两个概念,节点测试和轴:
*
等价于element()
,选择元素而不考虑名称。
默认轴是child::
,因此您的谓词实际上以child::element()
开头。
因此,
//android.view.ViewGroup[*/android.widget.TextView[@androidXtext='Microwaves']]
表示选择所有android.view.ViewGroup
元素,其孙android.widget.TextView
元素的androidXtext
属性值等于'Microwaves'
。
当您具体询问时,
而不是任何其他高于或低于
除了您的示例 XML 没有满足上述条件的其他元素之外,请注意,如果您将 */
解释为选择所有后代的通配符,则它不会。如上所述,它只跳过过去的子元素。要选择和测试谓词中的所有后代android.widget.TextView
元素,而不是*/android.widget.TextView
,请使用descendent::android.widget.TextView
或descendent-or-self::android.widget.TextView
(缩写形式:.//android.widget.TextView
)。
另见
What is the difference between .// and //* in XPath? What is meaning of .// in XPath? Difference between "//" and "/" in XPath?【讨论】:
以上是关于*/ 在 XPath 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章