0

GroovyMarkupBuilder有一个omitNullAttributes和一个omitEmptyAttributes。但StreamingMarkupBuilder没有。
我有这样的标签<foo />

我可以从最终输出中省略它们吗?

PS我可以以某种方式使用帖子中的技巧Omit empty attributes with groovy DOMBuilder吗?

更新: XML 示例

<A>
<Header><ID>1234</ID></Header>
<Body>
<item>
<id>001</id>
<foo />
</item>
</Body>
</A>
4

1 回答 1

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 添加空元素,我不知道这样做。我想你可以重新实现类本身来处理这个问题,但除此之外,你被卡住了......

但是应该说,您在问题中指出的两个属性都不会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 )
于 2011-11-22T12:57:07.537 回答