2016-08-03 35 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

相关问题