Как добавить узел в замыкание, используемый StreamingMarkupBuilder - PullRequest
1 голос
/ 22 ноября 2011

У меня есть следующее закрытие:

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

Я могу сериализовать его представление XML с помощью StreamingMarkupBuilder (импорт опущен):

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

которые дают мне:

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

Но теперь я хочу добавить новую запись перед вызовом bind() метода StreamingMarkupBuilder, чтобы получить:

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

Как я могу это сделать ( т.е. 1017 * манипулировать закрытием, чтобы вставить новый узел, я не хочу воссоздавать весь myData, чтобы просто вставить один элемент)?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Без изменения myData (как говорит erimerturk ) или выполнение двух проходов, то есть:

  1. создать xml с myData
  2. разобрать этот xml с XmlParser
  3. вставить узел в нужное место
  4. написать этот новый xml

Я не думаю, что это возможно .. Вопрос сводится к:

Как вставить операторы в середину существующего замыкания

На что простой ответ "Вы не можете" *

(* может быть возможно сделать то, что вы пытаетесь, с помощью трансформации AST, но я чувствую, что в этом случае это может оказаться невозможным)

0 голосов
/ 23 ноября 2011

Следующее решение работает для моего конкретного случая, но не полностью отвечает на вопрос ( т.е. пройти и изменить замыкание)

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