*/ 在 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 默认 axischild,所以你的谓词

[*/android.widget.TextView[@androidXtext='Microwaves']]

等同于

[child::*/child::android.widget.TextView[@androidXtext='Microwaves']]

此谓词将 select 个具有 android.widget.TextView 个孙子和指定属性的节点。

这里有两个概念,节点测试和轴:

  1. * 等同于 element(),select 元素而不考虑名称。

  2. 默认轴是 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.TextViewdescendent-or-self::android.widget.TextView(缩写形式:.//android.widget.TextView)代替 */android.widget.TextView

另见