2016-09-05 52 views
1

XML的XPath立即前置兄弟

<root> 
    <p>nodea text 1</p> 
    <p>nodea text 2</p> 
    <nodea> 
    </nodea> 
    <p>nodeb text 1</p> 
    <p>nodeb text 2</p> 
    <nodeb> 
    </nodeb> 
</root> 

我想NODEA或NodeB的第一前置兄弟p標籤(如果有)。例如,對於上面的XML用於各個節點前述兄弟姐妹

NODEA前述兄妹

<p>nodea text 1</p> 
<p>nodea text 2</p> 

基站前述兄妹

<p>nodeb text 1</p> 
<p>nodeb text 2</p> 

我已經嘗試下面的xpath但它給我是nodea的前面的p標籤而不是nodeb。

nodeb = xml.find('nodeb') 
nodeb.xpath('preceding-sibling::p[not(preceding-sibling::nodea)][1]') 

如果在節點之前沒有前面的p標記,那麼它應該返回空列表。例如,對於下面的xml,nodeb中沒有前面的同級p標籤。

<root> 
    <p>nodea text 1</p> 
    <nodea> 
    </nodea> 
    <nodeb> 
    </nodeb> 
</root> 

這將是很好,如果有人也可以解釋爲什麼我的XPath是沒有工作,我應該怎麼記住寫的XPath是什麼時候?

回答

3

您可以選擇preceding-sibling::*[1][self::p]選擇前面的兄弟元素,如果它是一個p元素。

至於你的嘗試,我想如果你選擇nodeb元素,然後要選擇preceding-sibling::p[preceding-sibling::nodea][1]只要你想看看兄弟p s表示是nodebnodea元之間。你的條件確實preceding-sibling::p[not(preceding-sibling::nodea)][1]選擇p兄弟姐妹沒有一個前nodea兄弟,這些都是以文檔順序的前兩個p元素。

+0

其工作。你可以添加一些解釋我的xpath有什麼問題。 – MA1

+0

@ MA1,我爲你的嘗試添加了一些解釋。 –