簡體   English   中英

xpath 按元素和屬性查找節點,其中包含具有特定 id 的子元素

[英]xpath to find node by element and attribute containing a child element with a certain id

在 c# 中,我試圖找到一個xpath表達式,它將獲得一個<property>元素的值,該元素的 ID 為ROBEGIN ,其父級為<option> ,並且該父級包含一個 ID 為CEProductID且值為5832198a-7cec-ea11-a817-000d3a191efa的子<property> 5832198a-7cec-ea11-a817-000d3a191efa 我想要得到的期望值是777 這是來自大型 xml 文件的 xml 片段:

...
<option id="Whatever">
   <property id="CEProductID">5832198a-7cec-ea11-a817-000d3a191efa</property>
   ...
   <property id="ROBEGIN">777</property>
</option>
...

重要提示:要使<option>正確匹配,它必須包含上面顯示的兩個子元素,以及正確的id屬性值和CEProductID的正確元素值。 如果它有一個或另一個匹配的<property>但不是兩者都匹配,則應忽略它。

我嘗試了以下(以及它的其他排列)但沒有成功:

xmlNode.SelectNodes($"//property[@id='CEProductID']='5832198a-7cec-ea11-a817-000d3a191efa'");

誠然,上面的 c# 代碼行(即使它有效)只會讓我得到CEProductID <property>元素,我可以用它 go 以編程方式到達父級,然后返回到屬性以查看<ROBEGIN>是否存在,如果是,則獲取該值。 但這似乎超級低效,我認為 xpath 比這更強大。

它是如何完成的?

這應該可以得到你所需要的:

//property [@id = 'ROBEGIN' and
    parent::option [property
        [@id = 'CEProductID' and text() = '5832198a-7cec-ea11-a817-000d3a191efa' ]]
]/text()

讓我們分解一下:

  • //property下降到任何名為property的節點
  • [@id='ROBEGIN'具有此匹配屬性id
  • and parent::option並有一個名為option的父節點
  • 這又具有[property子節點
  • 這又具有[@id='CEProductID'屬性
  • 並且該節點的內部文本匹配text()='5832198a-7cec-ea11-a817-000d3a191efa'
  • ]]]/text()回到原來的節點,取內部文本

結果:

  • 777

如果我理解正確,您希望將選項標簽與問題中所述的兩個屬性匹配,然后將 go 向下第二個 ROBEGIN 並提取內部 html。

//option[property[@id='CEProductID'] and property[@id='ROBEGIN']]/property[@id='ROBEGIN']/text()

# 777

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM