1

MarkupBuilder を使用して xml を作成していますが、子ノードを作成するときに親属性を更新するにはどうすればよいでしょうか。親要素を構築するときに子要素の数を計算できないと仮定します。

 def writer = new StringWriter()
 def xml = new MarkupBuilder(writer)

 xml.parent(totalDuration: 'should be: some of all child duration') {
     child(duration: '1')
     child(duration: '2') 
...  
 }

子ノードから親ノードにアクセスするエレガントな方法はありますか?

ありがとうタル

4

1 に答える 1

1

子ノードから親ノードにアクセスするエレガントな方法はありますか?

ストリーミング方式で 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.yieldDOMBuilder は、クロージャーを使用していないかmkp.yieldUnescaped、クロージャー内にない限り、MarkupBuilder と同じように機能するはずです。これらを使用する必要がある場合は、totalDuration属性なしで XML 文字列を構築し、それを DOM に再解析し、追加の属性を追加して再シリアル化する必要があります。

于 2013-10-03T10:55:04.427 に答える