使用groovy StreamingMarkupBuilder省略空元素

时间:2011-11-22 12:33:15

标签: xml groovy markupbuilder

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>

1 个答案:

答案 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 )