【问题标题】: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_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>

【问题讨论】:

    标签: xml android-layout xpath


    【解决方案1】:

    XPath 默认的axischild,所以你的谓词

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

    等价于

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

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

    【讨论】:

      【解决方案2】:

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

      1. * 等价于element(),选择元素而不考虑名称。

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

      另见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-12
        • 2017-06-11
        • 2018-03-05
        • 2023-03-27
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多