使用xpath删除节点

7

我有一个如下的XML结构:

<a>
   <b>
      <foo>null</foo>
   </b>
   <b>
      <foo>abc</foo>
   </b>
   <b>
      <foo>efg</foo>
   </b>
</a>

我正在使用org.w3c.dom.Document更新节点。当<foo>的值为null时,我想要删除它。
<b>
  <foo>null</foo>
</b>

这是否可行?我知道可以调用removeChild(childElement),但不确定如何指定删除上面的特定嵌套元素。

更新:根据下面的答案,我尝试了:

String query = "/a/b[foo[text() = 'null']]";
Object result = (xpath.compile(newQuery)).evaluate(doc, NODE);
NodeList nodes = (NodeList)result;
for (int i = 0; i < nodes.getLength(); i++)
{
    Node node = nodes.item(i);
    doc.removeChild(node);
}

我遇到了一个错误:NOT_FOUND_ERR:尝试在不存在的上下文中引用节点。

2个回答

12
doc.removeChild(node);

无法工作,因为您试图删除的节点不是文档节点的子节点,而是文档元素(a)的子节点,而文档元素本身是文档根节点的子节点。您需要在正确的父节点上调用removeChild

node.getParentNode().removeChild(node);

VBA 的等价语句是 node.ParentNode.RemoveChild node。 - Jamie Garroch - MVP

3

要获取该节点,您可以使用XPath:

/a/b[foo[text() = 'null']]

可以,但如果我在上面调用removeChild,它会删除仅仅是<foo>null</foo>还是<b><foo>null</foo></b>。另外,我不想触及根节点<a> - rgamber
根据您的问题,您想要删除<b><foo>null</foo></b>,是吗? - Kirill Polishchuk
是的。我在想这个查询也会尝试删除/修改<a>标签。 - rgamber
谢谢您的时间。我正在尝试使用新的查询,但仍然出现错误。有什么建议吗? - rgamber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接