2013-10-03 87 views
1

我使用MarkupBuilder構建XML並想知道如何在創建子節點時更新父屬性。假設構建父元素時無法計算子元素的數量。Groovy markupBuilder更新父節點

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') 
... 
} 

有沒有從子節點訪問父節點的優雅方式?

感謝 塔爾

回答

1

是否有從子節點訪問父節點的一個優雅的方式?

未與MarkupBuilder的,其產生以流方式的XML(它已經寫入的父元素的開始標籤到輸出流調用嵌套閉合之前)。但是,你可以使用一個DOMBuilder建立在內存中的DOM樹,然後使用DOM API總填,最後序列化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) 

的DOMBuilder應該工作一樣一個MarkupBuilder,只要你不在關閉中使用或mkp.yieldUnescaped。如果您需要使用這些屬性,那麼您必須構建不帶totalDuration屬性的XML字符串,然後將其重新解析爲DOM,添加額外的屬性並重新序列化。

相關問題