2008-09-19 62 views
32

是否可以使用XPath來僅選擇具有特定子元素的節點?例如,從這個XML我只想要寵物中的元素有一個「酒吧」的孩子。因此,所產生的數據集將包含從這個例子中,lizardpig元素:XPath能否僅返回具有X子級的節點?

<pets> 
    <cat> 
    <foo>don't care about this</foo> 
    </cat> 
    <dog> 
    <foo>not this one either</foo> 
    </dog> 
    <lizard> 
    <bar>lizard should be returned, because it has a child of bar</bar> 
    </lizard> 
    <pig> 
    <bar>return pig, too</bar> 
    </pig> 
</pets> 

此XPath給了我所有的寵物:"/pets/*",但我只想有名字'bar'的子節點的寵物。

+1

不要低估了W3C規範的可讀性和實用性方面。在the spec這樣的問題的答案中查找這樣的問題的答案可能會更快,這些答案非常易讀且完整,並帶有許多示例。 – Confusion 2008-09-20 08:45:40

回答

45

這是在其所有的榮耀

/pets/*[bar] 

英語:給我你所有的孩子pets有一個孩子bar

21
/pets/child::*[child::bar] 

我原諒,我沒有看到意見的先前的回覆。

但在這種情況下,我寧願喜歡使用descendant::軸,其中包括所有元素從下定義:

/pets[descendant::bar] 
4

萬一你想具體談談孩子 - 你也可以使用選擇器上。

例子:

<pets> 
    <cat> 
     <foo>don't care about this</foo> 
    </cat> 
    <dog> 
     <foo>not this one either</foo> 
    </dog> 
    <lizard> 
     <bar att="baz">lizard should be returned, because it has a child of bar</bar> 
    </lizard> 
    <pig> 
     <bar>don't return pig - it has no att=bar </bar> 
    </pig> 
</pets> 

現在,你只關心所有pets有任何孩子bar具有與價值baz屬性att。您可以使用下面的XPath表達式:

//pets/*[descendant::bar[@att='baz']] 

結果

<lizard> 
    <bar att="baz">lizard should be returned, because it has a child of bar</bar> 
</lizard> 
+0

想要所有屬於元素的寵物都有特定的文字()?似乎我無法弄清楚那一個...... – jeremfg 2017-10-12 01:02:20

相關問題