在Groovy中删除XML中的空标签

balp4ylt  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(177)

很抱歉打扰了一个原始的问题。我有一个多Map格式的xml输出如下。
需要从xml中删除空标记和多Map标记。

<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
    <multimap:Message1>
        <root>
            <budgets/>
        </root>
        <root>
            <budgets/>
        </root>
        <root>
            <budgets>
                <id>1234</id>
                <field2>4496</field2>
                <field3>test</field3>
            </budgets>
        </root>
        <root>
            <budgets/>
        </root>
        <root>
            <budgets>
        </root>
    </multimap:Message1>
</multimap:Messages>

预期输出如下

<base1> 
    <root>
        <budgets>
            <id>1234</id>
            <field2>4496</field2>
            <field3>test</field3>
        </budgets>
    </root>
</base1>

尝试以下代码,

def body = message.getBody(java.lang.String) as String;
body = body.replaceAll("<multimap:Messages xmlns:multimap=", "");
body = body.replaceAll("\"http://sap.com/xi/XI/SplitAndMerge\">", "");
body = body.replaceAll("</multimap:Messages>", "");
body = body.replaceAll("multimap:Message", "base")
body = body.replaceAll("\\<\\?xml(.+?)\\?\\>", "").trim();

def list = new XmlParser().parseText(body)
def list1 = list.'**'.findAll{it.children().size() == 0 }
list1.each{ 
    list.remove(it)
}

也尝试使用以下代码:

list.'**'.removeAll{ it.children().size() == 0 }

不知道我在这里错过了什么。非常感谢你帮助解决这个问题。

bqf10yzr

bqf10yzr1#

使用一些简单的XML处理:

import groovy.xml.*

def xml = new XmlSlurper().parseText '''\
<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
    <multimap:Message1>
        <root>
            <budgets/>
        </root>
        <root>
            <budgets/>
        </root>
        <root>
            <budgets>
                <id>1234</id>
                <field2>4496</field2>
                <field3>test</field3>
            </budgets>
        </root>
        <root>
            <budgets/>
        </root>
        <root>
            <budgets/>
        </root>
    </multimap:Message1>
</multimap:Messages>'''

List notEmptyBudgets = xml.'**'.findAll{ 'budgets' == it.name() && it.children().size() }

def writer = new StringWriter()

def out = new StreamingMarkupBuilder().bind{
  base1{
    root{
      notEmptyBudgets.each{ b ->
        budgets{
          b.children().each{ "${it.name()}" it.text() }
        }
      }
    }
  }
}

XmlUtil.serialize out

退货

<?xml version="1.0" encoding="UTF-8"?><base1>
  <root>
    <budgets>
      <id>1234</id>
      <field2>4496</field2>
      <field3>test</field3>
    </budgets>
  </root>
</base1>

相关问题