簡體   English   中英

Select 具有 XPath 的節點,其子節點包含特定的內部文本

[英]Select a node with XPath whose child node contains a specific inner text

鑒於以下 XML:

<root>
    <li><span>abcText1cba</span></li>
    <li><span>abcText2cba</span></li>
</root>

我想要 select 所有li元素都有一個包含Text1內部文本的span子節點 - 使用 XPath。

我從/root/li[span]開始,然后嘗試進一步檢查: /root/li[span[contains(text(), 'Text1')]]

但是,這不會返回任何節點。 我不明白為什么,有人可以幫助我嗎?

僅供讀者閱讀。 xpath是正確的。 OP:也許xpath解析器不支持表達式?

/root/li[span[contains(text(), "Text1")]]
//li[./span[contains(text(),'Text1')]] - have just one target result
//li[./span[contains(text(),'Text')]] - returns two results as target

這種方法使用的東西在任何地方都沒有很好的記錄,只有少數人了解它的強大功能

在此輸入圖像描述

Xpath指定的元素具有由另一個xpath定義的子節點

在此輸入圖像描述

xpath Kent Kostelac提供:

//span[contains(text(), 'Text1')]/parent::li

也可以這樣表示:

//li[span[contains(text(), 'Text1')]]

這有點短,並通過說“給我包含顯示'Text1'的跨度的li”來提高可讀性; 而不是說“你能看到那個顯示'Text1'的跨度嗎?好的,所以把它的 li parent 給我”,這就是原來的措辭實際上在說什么。

要檢查深層嵌套子項中的內容,請在 Xpath 表達式中使用.//*

<div class="foo h1">
    <p>
      <span>
         <b>bar</b>
      </span>
    </p>
</div>

要找到一個帶有 class .foo的 div,它也包含一個帶有文本欄的孩子,只需使用以下bar表達式

$x('//div[contains(@class, "foo") and .//*[contains(text(), "bar")]]')

試試這個XPath

li/*[@innertext='text']

您當前的xpath應該是正確的。 這是一個替代但丑陋的。

XmlNodeList nodes = doc.SelectNodes("//span/parent::li/span[contains(text(), 'Text1')]/parent::li");

我們找到了所有的span-tag。 然后我們找到所有帶有span-tag作為子標簽的li-tag並包含'Text1'。

或簡單地說:

// span [contains(text(),'Text1')] / parent :: li

暫無
暫無

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

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