使用Groovy从XML中删除所有空节点

时间:2018-02-14 00:09:29

标签: java xml groovy xml-parsing removechild

我想使用groovy删除所有空节点

这是xml,我想删除电话和团队

<Profile>
    <Name>Fin</Name>
    <Aga>20</Aga>
    <Contact>
        <Mobile>1819</Mobile>
        <Telephone/>
    </Contact>
    <Team>
        <Team1/>
        <Team2/>
    </Team>
</Profile>

这是我的代码。

  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.transform.OutputKeys;
  import javax.xml.transform.Transformer;
  import javax.xml.transform.TransformerException;
  import javax.xml.transform.TransformerFactory;
  import javax.xml.transform.dom.DOMSource;
  import javax.xml.transform.stream.StreamResult;

   import org.w3c.dom.Document;
   import org.w3c.dom.Node;


   import groovy.xml.*

boolean cleanNode( def node ) {
    node.value().with { a ->
        a.findAll { !it.value }.each { a.remove( it.key ) }
    }
    node.children().with { kids ->
        kids.findAll { it instanceof Node ? !cleanNode( it ) : false }
            .each { kids.remove( it ) }
    }
    node.attributes() || node.children() || node.text()
}




static main(args) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder parser = factory.newDocumentBuilder();
    Document xmlDoc = parser.parse("C:/Users/Myuser/Desktop/Testxml2.xml");//file has the xml*/
    String xml = nodeToString(xmlDoc.getDocumentElement());
    def root = new XmlParser().parseText( xml );
    cleanNode(root)
    def test = XmlUtil.serialize(root);
    println test;
}

static String nodeToString(Node node) {
    StringWriter sw = new StringWriter();
    try {
      Transformer t = TransformerFactory.newInstance().newTransformer();
      t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
      t.setOutputProperty(OutputKeys.INDENT, "yes");
      t.transform(new DOMSource(node), new StreamResult(sw));
    } catch (TransformerException te) {
      System.out.println("nodeToString Transformer Exception");
    }
    return sw.toString();
}

但这不起作用,因为电话和团队未被删除

这是输出

<Profile>
        <Name>Fin</Name>
        <Aga>20</Aga>
        <Contact>
            <Mobile>1819</Mobile>
            <Telephone/>
        </Contact>
        <Team>
            <Team1/>
            <Team2/>
        </Team>
  </Profile>

这是预期结果

<Profile>
    <Name>Fin</Name>
    <Aga>20</Aga>
    <Contact>
        <Mobile>1819</Mobile>
    </Contact>
</Profile>

你能告诉我这个吗?

1 个答案:

答案 0 :(得分:1)

您可以按照以下说明进行操作:

  • 查找节点文本为空的所有节点名称
  • 循环通过上面的查找结果,并删除节点
def xmlString = """<Profile>
    <Name>Fin</Name>
    <Aga>20</Aga>
    <Contact>
        <Mobile>1819</Mobile>
        <Telephone/>
    </Contact>
    <Team>
        <Team1/>
        <Team2/>
    </Team>
</Profile>"""

def xml = new XmlParser().parseText(xmlString)
def nodes = xml.'**'.findAll{it.name() && !it.text()}
def removeNode = { node ->
   def parent = node.parent()
   parent.remove(node)
}

nodes.each{removeNode(it)}
println groovy.xml.XmlUtil.serialize(xml)

你也可以快速尝试相同的在线 demo