对,所以从评论来看,您似乎正在尝试剥离空元素,而不是空属性......
如果要从 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 添加空元素,我不知道这样做。我想你可以重新实现类本身来处理这个问题,但除此之外,你被卡住了......
但是应该说,您在问题中指出的两个属性都不会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 )