子ノードから親ノードにアクセスするエレガントな方法はありますか?
ストリーミング方式で XML を生成する MarkupBuilder ではありません (ネストされたクロージャを呼び出す前に、親要素の開始タグが出力ストリームに既に書き込まれています)。しかし、DOMBuilderを使用してメモリ内に DOM ツリーを構築し、次に DOM API を使用して合計を入力し、最後に total 属性を含む DOM ツリーをシリアル化することができます。
import groovy.xml.*
import groovy.xml.dom.*
import org.w3c.dom.*
def dom = DOMBuilder.newInstance(false, true)
Element parent = dom.parent() {
child(duration:'1')
child(duration:'2')
}
use(DOMCategory) {
parent.setAttributeNS(null, "totalDuration",
parent.xpath('sum(child/@duration)'))
}
def xmlString = XmlUtil.serialize(parent)
mkp.yield
DOMBuilder は、クロージャーを使用していないかmkp.yieldUnescaped
、クロージャー内にない限り、MarkupBuilder と同じように機能するはずです。これらを使用する必要がある場合は、totalDuration
属性なしで XML 文字列を構築し、それを DOM に再解析し、追加の属性を追加して再シリアル化する必要があります。