我想从XML元素中删除空节点.
这个xml是从供应商生成的,我没有xml生成的控制权.但由于XML几乎没有空节点,我需要递归删除这些空节点.
这个xml来自OMElement,我使用[XMLUtils] [1]从这个对象获取一个元素
示例XML
something
something
something else
由于D21是一个空节点我想删除D21,因为现在D2是一个空节点我想删除D2,但由于D有D1我不想删除D.
同样地,我有可能得到
现在因为C是空的,我想删除C然后B然后最终删除节点A.
我试图在Node中使用removeChild()方法执行此操作
但到目前为止,我无法递归删除它们.
有什么建议可以递归删除它们吗?
我递归地尝试获取节点和节点长度.但节点长度没有帮助
if(childNode.getChildNodes().getLength() == 0 ){
childNode.getParentNode().removeChild(childNode);
}
问候
Dheeraj Joshi
解决方法:
这样做,只需创建一个“深入”的递归函数,然后在“备份树”的路上删除空节点,这将同时删除D21和D2.
public static void main(String[] args) throws Exception {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
String input = "somethingsomethingsomething else";
Document document = builder.parse(new InputSource(new StringReader(
input)));
removeNodes(document);
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(new DOMSource(document), result);
System.out.println(result.getWriter().toString());
}
public static void removeNodes(Node node) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
removeNodes(list.item(i));
}
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) {
node.getParentNode().removeChild(node);
}
}
产量
something
something
something else
标签:java,xml,xmlnode
来源: https://codeday.me/bug/20190723/1511735.html