XPath - 获取没有特定类型子节点的节点

Mar*_*ing 62 xpath

XML:/A/B/A

我想得到所有A没有B孩子的节点.

我试过了

/A[not(B)]  
/A[not(exists(B))]
Run Code Online (Sandbox Code Playgroud)

没有成功

/*[local-name()="A" and .... ]如果可能的话,我更喜欢带语法的解决方案.有效的想法吗?

澄清.xml看起来像:

<WhatEver>
  <A>
    <B></B>
  </A>
</WhatEver> 
Run Code Online (Sandbox Code Playgroud)

要么

<WhatEver>
  <A></A>
</WhatEver>
Run Code Online (Sandbox Code Playgroud)

ala*_*mar 46

也许 *[local-name() = 'A' and not(descendant::*[local-name() = 'B'])]

此外,应该只有一个根元素,所以/A[...]你要么得到所有的XML,要么没有.也许//A[not(B)]还是/*/A[not(B)]

我真的不明白为什么/A[not(B)]不适合你.

~/xml% xmllint ab.xml
<?xml version="1.0"?>
<root>
    <A id="1">
            <B/>
    </A>
    <A id="2">
    </A>
    <A id="3">
            <B/>
            <B/>
    </A>
    <A id="4"/>
</root>
~/xml% xpath ab.xml '/root/A[not(B)]'
Found 2 nodes:
-- NODE --
<A id="2">
    </A>
-- NODE --
<A id="4" />
Run Code Online (Sandbox Code Playgroud)


Ser*_*hiy 15

试试这个"/A[not(.//B)]"或者这个"/A[not(./B)]".

  • “尝试一下”答案在 Stackoverflow 上的价值很低,因为它们对教育/授权 OP 和数千名未来的研究人员几乎没有作用。 (2认同)

Ant*_*nes 10

第一个/导致XPath从文档的根开始,我怀疑这是你的意图.

也许你的意思是// [不是(B)]会在文档中找到没有直接B子级的任何级别的所有A节点.

或者您可能已经在包含A节点的节点上,在这种情况下,您只需要A [not(B)]作为XPath.