Groovy的MarkupBuilder
有一个omitNullAttributes
和一个omitEmptyAttributes
。但StreamingMarkupBuilder
没有
我有一个标记<foo />
我可以从最终输出中省略它们吗?
P.S。我可以以某种方式使用帖子Omit empty attributes with groovy DOMBuilder中的技巧吗?
更新 XML示例
<A>
<Header><ID>1234</ID></Header>
<Body>
<item>
<id>001</id>
<foo />
</item>
</Body>
</A>
答案 0 :(得分:1)
是的,所以从评论来看,您似乎试图剥离空元素,不空属性......
如果要从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添加空元素,我无法知道这样做。我想你可以重新实施the class itself来处理这个问题,但除此之外,你就被卡住了......
但是应该说,你在问题中指出的两个属性都不会使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 )