如何在StreamingMarkupBuilder使用的闭包中添加节点

时间:2011-11-22 13:27:39

标签: xml groovy xml-serialization

我有以下关闭:

def myData = {
    mkp.xmlDeclaration()
    OneEntry() {
        SecondInnerEntry()
    }
}

我可以使用StreamingMarkupBuilder(省略导入)序列化其XML表示:

System.out << XmlUtil.serialize(new StreamingMarkupBuilder().bind(myData))

哪位给我:

<?xml version="1.0" encoding="UTF-8"?>
<OneEntry>
  <SecondInnerEntry/>
</OneEntry>

但是现在我想在调用bind()的{​​{1}}方法之前添加一个新条目来获取:

StreamingMarkupBuilder

我该怎么做(操纵闭包来插入一个新节点,我不想重新创建整个<?xml version="1.0" encoding="UTF-8"?> <OneEntry> <FirstInnerEntry/> <SecondInnerEntry/> </OneEntry> 只插入一个元素)?

2 个答案:

答案 0 :(得分:2)

不改变myData(如erimerturk所述),或执行两次传递,即:

  1. 使用myData
  2. 生成xml
  3. 使用XmlParser
  4. 解析此xml
  5. 在所需位置插入节点
  6. 写下这个新的xml
  7. 我不认为这是可能的..问题归结为:

      

    如何在现有闭包中插入语句

    简单的回答是“你不能”*

    (*有可能通过AST转换做你正在尝试的事情,但我觉得在这种情况下可能不可能)

答案 1 :(得分:0)

以下解决方案适用于我的具体案例,但没有完全回答问题(行走和修改闭包)

import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil

def dataToInsert = {
    FirstInnerEntry()
}

def myData = {
    mkp.xmlDeclaration()
    OneEntry() {
        mkp.yield dataToInsert
        SecondInnerEntry()
    }
}

System.out << XmlUtil.serialize(new StreamingMarkupBuilder().bind(myData))