そうです、コメントから、空の属性ではなく、空の要素を削除しようとしているようです...
xmlから空のノードを削除する場合は、それを読み込み、空のノードを見つけて削除し、書き戻す必要があります...
この例のように:
def xml = new StringWriter().with { sw ->
new groovy.xml.MarkupBuilder( sw ).with { mb ->
a {
b( 'tim' )
foo()
}
sw.toString()
}
}
def parser = new XmlParser().parseText( xml )
def emptykids = parser.depthFirst().findAll { it.children().size() == 0 }
emptykids.each {
parser.remove( it )
}
new XmlNodePrinter().print( parser )
ただし、StreamingMarkupBuilderを使用するときにXMLに空の要素を追加したくない場合は、これを行うことを私が知る方法はありません。これを処理するためにクラス自体を再実装できると思いますが、それ以外は行き詰まっています...
ただし、質問で指摘した2つの属性のどちらも、MarkupBuilder
これを実行することはできません。空の属性の追加は停止しますが、空の要素は追加されます
これで、次の作業を行う例があります。
これを試して:
def xml = '''|<A>
|<Header><ID>1234</ID></Header>
|<Body>
|<item>
|<id>001</id>
|<foo />
|</item>
|</Body>
|</A>'''.stripMargin()
def parser = new XmlParser().parseText( xml )
parser.depthFirst().each {
if( it.children().size() == 0 ) {
it.parent().remove( it )
}
}
new XmlNodePrinter().print( parser )