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 填充总数,最后将包含总数属性的 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.yieldmkp.yieldUnescaped在闭包内, DOMBuilder 应该与 MarkupBuilder 一样工作。如果您需要使用这些,那么您必须构建没有totalDuration属性的 XML 字符串,然后将其重新解析为 DOM,添加额外的属性并重新序列化。

于 2013-10-03T10:55:04.427 回答