![](/img/trans.png)
[英]How to print plain content at the end of node using groovy MarkupBuilder?
[英]Groovy markupBuilder updating parent node
我正在使用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')
...
}
是否有一种从子节点访问父节点的优雅方法?
谢谢塔尔
是否有一种从子节点访问父节点的优雅方法?
不适用于以流方式生成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
或mkp.yieldUnescaped
,DOMBuilder就应该与MarkupBuilder一样工作。 如果需要使用它们,则必须构建没有totalDuration
属性的XML字符串,然后将其重新解析为DOM,添加多余的属性并重新序列化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.