Xml 使用groovy StreamingMarkupBuilder忽略空元素
Groovy的Xml 使用groovy StreamingMarkupBuilder忽略空元素,xml,groovy,markupbuilder,Xml,Groovy,Markupbuilder,Groovy的MarkupBuilder有一个omitNullAttributes和一个omitEmptyAttributes。但是StreamingMarkupBuilder没有 我有一个这样的标签 我可以从最终输出中省略它们吗 顺便问一下,我能不能用一下邮报上的技巧 更新: XML示例 <A> <Header><ID>1234</ID></Header> <Body> <item> <id>001
MarkupBuilder
有一个omitNullAttributes
和一个omitEmptyAttributes
。但是StreamingMarkupBuilder
没有
我有一个这样的标签
我可以从最终输出中省略它们吗
顺便问一下,我能不能用一下邮报上的技巧
更新:
XML示例
<A>
<Header><ID>1234</ID></Header>
<Body>
<item>
<id>001</id>
<foo />
</item>
</Body>
</A>
1234
001
是的,从注释中可以看出,您试图剥离的是空元素,而不是空属性
如果要从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 )
defxml=''|
|1234
|
|
|001
|
|
|
|''.stripMargin()
def parser=new XmlParser().parseText(xml)
parser.depthFirst().each{
if(it.children().size()==0){
it.parent().remove(它)
}
}
新的XmlNodePrint().print(解析器)
你有没有举例说明你的意思<代码>没有任何属性,似乎是一个令人困惑的例子……现在我有一个类似的例子:。。。。我希望收到。。。。XML是一个复杂的XML,这样的空标记可能出现在XML中的任何位置(因此逐个检查不是一种情况)。但是无论是ompitNullAttributes
还是ompitEmptyAttributes
都不会从MarkupBuilder
中删除
,会吗?看起来您正在尝试删除空元素,不是属性…@tim_yates:我使用StreamingMarkupBuilder,它没有这样的属性。更正更新了问题。对我不起作用。.depthFirst()调用中可能存在的问题?我的XML层次结构更复杂(超过1级)。@FoxyBOA不幸的是,除非你给出一个不起作用的示例,否则我无法再帮助你了。。。我的灵媒能力现在有点枯竭了…在原始帖子中添加一个例子。