[英]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.