编程语言
首页 > 编程语言> > java – 以递归方式从XML中删除空节点

java – 以递归方式从XML中删除空节点

作者:互联网

我想从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.
我试图在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 = "<A><B><C><C1><C11>something</C11><C12>something</C12></C1></C><D><D1><D11><D111 operation=\"create\"><Node>something else</Node></D111></D11></D1><D2><D21></D21></D2></D></B></A>";

    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);
    }
}

产量

<A>
<B>
<C>
<C1>
<C11>something</C11>
<C12>something</C12>
</C1>
</C>
<D>
<D1>
<D11>
<D111 operation="create">
<Node>something else</Node>
</D111>
</D11>
</D1>
</D>
</B>
</A>

标签:java,xml,xmlnode
来源: https://codeday.me/bug/20190723/1511735.html