2016-08-03 75 views
2

我試圖抓住一個大組XML節點的所有的在同一水平(其元素名稱都不同),同時排除節點中的某個子集。例如:在XPath中,如何選擇所有不匹配子集的節點?

<root> 
    <foo>...</> 
    <foo>...</> 
    <bar>...</> 
    <bar>...</> 
    <baz>...</> 
    <spam>...</> 
    <eggs>...</> 
    <toast>...</> 
</root> 

所以我想一個XPath表達式給我的垃圾郵件雞蛋和烤麪包節點列表,同時排除了foobarbaz節點。我知道我想提前排除的節點,但不知道將留下什麼節點。

回答

1

對於格式良好的XML,

<root> 
    <foo/> 
    <foo/> 
    <bar/> 
    <bar/> 
    <baz/> 
    <spam/> 
    <eggs/> 
    <toast/> 
</root> 

使用這個XPath,

/root/*[not(self::foo or self::bar or self::baz)] 

選擇不在一組foobarroot所有子元素,或baz

<spam/> 
<eggs/> 
<toast/> 

的要求。

1

將三個Xpathes

/root/spam | /root/eggs | /root/toast 

或寫同中有異的方式

/root/*[contains("spam|eggs|toast", name())] 

UPDATE:

要排除的一組節點spameggstoast

/root/*[not(contains("spam|eggs|toast", name()))] 
+0

垃圾郵件,雞蛋和烤麪包片只是一個例子,可能有成百上千這是完全不同的在這個級別的節點,我只是希望排除一小部分是重複了很多 –

+0

,但我可以做: /根/ * [包含( 「富| |酒吧巴茲」,名稱())!]? –

+0

我已更新答案 – splash58

相關問題