*/ 在 XPath 中是什么意思?
What does */ mean in XPath?
为什么我的 XPath,
//android.view.ViewGroup[*/android.widget.TextView[@androidXtext='Microwaves']]
select这个节点,
<android.view.ViewGroup androidXclickable="true" androidXcontentDescription="ucl.flex-row" androidXenabled="true" androidXfocusable="true" androidXid="@ucl.flex-row" androidXlayout_height="147px" androidXlayout_width="1059px" androidXlayout_x="11px" androidXlayout_y="913px">`
而不是任何其他高于或低于?
完整片段:
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="147px" androidXlayout_width="1059px" androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXclickable="true" androidXcontentDescription="ucl.flex-row" androidXenabled="true" androidXfocusable="true" androidXid="@ucl.flex-row" androidXlayout_height="147px" androidXlayout_width="1059px" androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="147px" androidXlayout_width="1059px" 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_height="63px" androidXlayout_width="63px" androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="63px" androidXlayout_width="63px" androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="0px" androidXlayout_width="0px" androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="0px" androidXlayout_width="0px" 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_height="53px" androidXlayout_width="891px" androidXlayout_x="137px" androidXlayout_y="960px" androidXtext="Microwaves"/>
</android.view.ViewGroup>
</android.view.ViewGroup>
</android.view.ViewGroup>
XPath 默认 axis 是 child
,所以你的谓词
[*/android.widget.TextView[@androidXtext='Microwaves']]
等同于
[child::*/child::android.widget.TextView[@androidXtext='Microwaves']]
此谓词将 select 个具有 android.widget.TextView
个孙子和指定属性的节点。
这里有两个概念,节点测试和轴:
*
等同于 element()
,select 元素而不考虑名称。
默认轴是 child::
,因此您的谓词有效地以 child::element()
.
开头
因此,
//android.view.ViewGroup[*/android.widget.TextView[@androidXtext='Microwaves']]
表示 select 所有 android.view.ViewGroup
元素的孙 android.widget.TextView
元素的 androidXtext
属性值等于 'Microwaves'
.
当你具体询问时,
and not any other above or below
除了您的示例 XML 没有满足上述条件的其他元素外,请注意,如果您将 */
解释为通配符 selected 到所有后代,它不是。如上所述,它只跳过过去的子元素。要 select 并测试谓词中的所有后代 android.widget.TextView
元素,请使用 descendent::android.widget.TextView
或 descendent-or-self::android.widget.TextView
(缩写形式:.//android.widget.TextView
)代替 */android.widget.TextView
。
另见
为什么我的 XPath,
//android.view.ViewGroup[*/android.widget.TextView[@androidXtext='Microwaves']]
select这个节点,
<android.view.ViewGroup androidXclickable="true" androidXcontentDescription="ucl.flex-row" androidXenabled="true" androidXfocusable="true" androidXid="@ucl.flex-row" androidXlayout_height="147px" androidXlayout_width="1059px" androidXlayout_x="11px" androidXlayout_y="913px">`
而不是任何其他高于或低于?
完整片段:
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="147px" androidXlayout_width="1059px" androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXclickable="true" androidXcontentDescription="ucl.flex-row" androidXenabled="true" androidXfocusable="true" androidXid="@ucl.flex-row" androidXlayout_height="147px" androidXlayout_width="1059px" androidXlayout_x="11px" androidXlayout_y="913px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="147px" androidXlayout_width="1059px" 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_height="63px" androidXlayout_width="63px" androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="63px" androidXlayout_width="63px" androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="0px" androidXlayout_width="0px" androidXlayout_x="53px" androidXlayout_y="955px">
<android.view.ViewGroup androidXenabled="true" androidXlayout_height="0px" androidXlayout_width="0px" 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_height="53px" androidXlayout_width="891px" androidXlayout_x="137px" androidXlayout_y="960px" androidXtext="Microwaves"/>
</android.view.ViewGroup>
</android.view.ViewGroup>
</android.view.ViewGroup>
XPath 默认 axis 是 child
,所以你的谓词
[*/android.widget.TextView[@androidXtext='Microwaves']]
等同于
[child::*/child::android.widget.TextView[@androidXtext='Microwaves']]
此谓词将 select 个具有 android.widget.TextView
个孙子和指定属性的节点。
这里有两个概念,节点测试和轴:
*
等同于element()
,select 元素而不考虑名称。默认轴是
开头child::
,因此您的谓词有效地以child::element()
.
因此,
//android.view.ViewGroup[*/android.widget.TextView[@androidXtext='Microwaves']]
表示 select 所有 android.view.ViewGroup
元素的孙 android.widget.TextView
元素的 androidXtext
属性值等于 'Microwaves'
.
当你具体询问时,
and not any other above or below
除了您的示例 XML 没有满足上述条件的其他元素外,请注意,如果您将 */
解释为通配符 selected 到所有后代,它不是。如上所述,它只跳过过去的子元素。要 select 并测试谓词中的所有后代 android.widget.TextView
元素,请使用 descendent::android.widget.TextView
或 descendent-or-self::android.widget.TextView
(缩写形式:.//android.widget.TextView
)代替 */android.widget.TextView
。