以递归方式从 XML 中删除空节点 [英] Remove empty nodes from a XML recursively

查看:29
本文介绍了以递归方式从 XML 中删除空节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从 XML 元素中删除空节点.此 xml 是从供应商生成的,我无法控制 xml 生成.但由于 XML 几乎没有空节点,我需要递归删除这些空节点.

I want to delete the empty nodes from an XML element. This xml is generated from a vendor and i dont have control on xml generation. But since the XML has few empty nodes i need to delete those empty nodes recursively.

这个 xml 是从 OMElement 得到的,我使用 [XMLUtils][1] 从这个对象得到一个 Element示例 XML

This xml is got from OMElement and i get an Element from this object using [XMLUtils][1] Sample 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.

Since D21 is an empty node i want to delete D21 and since now D2 is an empty node i want to delete D2 but since D has D1 i dont want to delete D.

同样的,我可以得到

<A>
  <B>
    <C>

    </C>
  </B>
</A>

现在因为 C 是空的,我想删除 C,然后是 B,最后是节点 A.我正在尝试使用 节点

Now since C is empty i want to delete C and then B and then eventually node A. I am trying to do this using removeChild() method in Node

但到目前为止我无法递归删除它们.有什么建议可以递归删除它们吗?

But so far i am unable to remove them recursively. Any suggestions to remove them recursively?

我递归地尝试获取节点和节点长度.但是节点长度没有帮助

I am recursively trying to get node and node length. But node length is of no help

if(childNode.getChildNodes().getLength() == 0 ){
       childNode.getParentNode().removeChild(childNode);

               }

问候
杰拉吉·乔希

Regards
Dheeraj Joshi

推荐答案

这个有效,只需创建一个递归函数,先深入",然后在备份树"的过程中删除空节点,这将有去除D21和D2的效果.

This works, just create a recursive function that "goes deep" first, then removes empty nodes on the way "back up the tree", this will have the effect of removing both D21 and 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>

这篇关于以递归方式从 XML 中删除空节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆