0

Groovy'sにはとMarkupBuilderomitNullAttributesありomitEmptyAttributesます。しかし、StreamingMarkupBuilderそうではありません。
私はそのようなタグを持っています<foo />

最終出力からそれらを省略できますか?

PSどういうわけか、 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に空の要素を追加したくない場合は、これを行うことを私が知る方法はありません。これを処理するためにクラス自体を再実装できると思いますが、それ以外は行き詰まっています...

ただし、質問で指摘した2つの属性のどちらも、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 に答える