grails - Groovy markupBuilder更新父节点

标签 grails groovy markupbuilder

我正在使用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') 
...  
 }

是否有一种从子节点访问父节点的优雅方法?

谢谢
塔尔

最佳答案

Is there an elegant way of accessing the parent node from a child node?



不适用于以流方式生成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.yieldmkp.yieldUnescaped,DOMBuilder便应与MarkupBuilder相同。如果需要使用它们,则必须构建不带totalDuration属性的XML字符串,然后将其重新解析为DOM,添加多余的属性并重新序列化。

关于grails - Groovy markupBuilder更新父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19156260/

相关文章:

Grails 域验证器不工作

gradle - Groovy println 将空字符串打印到控制台而不是正确的字符串

java - 将Spring Boot jar名称传递给Gradle Groovy脚本

grails - MarkupBuilder呈现HTML SELECT元素

debugging - 从 IntelliJ 调试功能测试

hibernate - 清除特定域类的 hibernate 缓存

xml - 为什么 StreamingMarkupBuilder 在编写大型文档时比 MarkupBuilder 表现更好

grails - 在我的 Spock 测试中无法获取主体 ID

java - Gradle Plugin 如何将方法添加到特定 block ?