【问题标题】:Remove all empty nodes from XML with Groovy使用 Groovy 从 XML 中删除所有空节点
【发布时间】:2018-02-14 00:09:29
【问题描述】:

我想使用 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>

你能告诉我这个吗?

【问题讨论】:

  • Bell Aimsaard,请检查解决方案,看看是否能解决问题。

标签: java xml groovy xml-parsing removechild


【解决方案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

【讨论】:

  • 只是一个请求@rao,如果您可以将代码的输出粘贴到答案本身中,那就太好了。它可以节省时间,因为我们不需要转到演示页面。当我们想要编辑代码时,演示页面确实很有帮助
  • 感谢您的意见。如果您看到问题,OP 已经提到了所需的输出。但是演示链接的原因是自己尝试一下,看看它是否有效,并且正如您正确指出的那样,人们可以修改某些内容并轻松重试并快速完成。
  • 是的,但回答问题的人可能会忽略某些事情,就像您在我的上一个问题中记得的那样,在发布的答案中的输出 xml 中有一行额外的行,而原始问题中没有.所以我认为最好复制粘贴确切的输出
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
相关资源
最近更新 更多