我想从 XML 元素中删除空节点。
该 xml 是由供应商生成的,我无法控制 xml 的生成。但由于 XML 几乎没有空节点,我需要递归删除这些空节点。
这个 xml 是从 OMElement 获取的,我使用 [XMLUtils][1] 从这个对象获取一个元素
XML 示例
<A>
<B>
<C>
<C1>
<C11>something</C11>
<C12>something</C12>
</C1>
</C>
<D>
<D1>
<D11>
<D111 operation="create">
<Node>something else</Node>
</D11>
</D11>
</D1>
<D2>
<D21>
</D21>
</D2>
</D>
</B>
</A>
由于D21是一个空节点,我想删除D21,并且由于现在D2是一个空节点,我想删除D2,但由于D有D1,我不想删除D。
同样,我有可能得到
<A>
<B>
<C>
</C>
</B>
</A>
现在,由于 C 为空,我想删除 C,然后删除 B,最后删除节点 A。
我正在尝试使用removeChild()方法来做到这一点Node http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Node.html
但到目前为止我无法递归地删除它们。
有什么建议可以递归地删除它们吗?
我正在递归地尝试获取节点和节点长度。但节点长度没有帮助
if(childNode.getChildNodes().getLength() == 0 ){
childNode.getParentNode().removeChild(childNode);
}
Regards
迪拉吉·乔希
我没有足够的代表来评论 @Adam 的解决方案,但我遇到了一个问题,在删除节点后,该节点的最后一个兄弟节点被移动到索引零,导致它无法完全删除空元素。解决方法是使用一个列表来保存我们想要递归调用删除的所有节点。
此外,还有一个错误删除了具有属性的空元素。
这两个问题的解决方案:
public static void removeEmptyNodes(Node node) {
NodeList list = node.getChildNodes();
List<Node> nodesToRecursivelyCall = new LinkedList();
for (int i = 0; i < list.getLength(); i++) {
nodesToRecursivelyCall.add(list.item(i));
}
for(Node tempNode : nodesToRecursivelyCall) {
removeEmptyNodes(tempNode);
}
boolean emptyElement = node.getNodeType() == Node.ELEMENT_NODE
&& node.getChildNodes().getLength() == 0;
boolean emptyText = node.getNodeType() == Node.TEXT_NODE
&& node.getNodeValue().trim().isEmpty();
if (emptyElement || emptyText) {
if(!node.hasAttributes()) {
node.getParentNode().removeChild(node);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)