Groovy разметка построителя заменить рут
import groovy.xml.MarkupBuilder
class XmlTest {
static void main(def args) {
def XmlTest s = new XmlTest()
s.xmlTest()
}
def xmlTest() {
def xml = new MarkupBuilder()
xml.root{
response(this.xmlClosure())
}
}
def xmlClosure() {
return {x("y")}
}
}
Ожидаемый результат <x>y</x>
Я не могу изменить закрытие. Мне нужно преобразовать замыкание в документ XML без добавления каких-либо узлов.
1 ответ
Решение
Это может помочь, но если у вас больше типов элементов, чем просто "x", вам, вероятно, стоит немного его расширить. Позволяя сборщику писать автору, вы можете контролировать результат более контролируемым образом. Затем, используя программу записи, вы можете извлечь нужные элементы с помощью StreamingMarkupBuilder.
Это очень обходной путь, и для очень больших XML-структур он может быть не очень эффективным.
Я также позволил себе опустить элемент "ответ", так как не видел, чтобы это имело смысл. Не стесняйтесь положить его обратно, если вам это абсолютно необходимо.
import groovy.xml.MarkupBuilder
import groovy.util.XmlSlurper
import groovy.xml.StreamingMarkupBuilder
class XmlTest {
static void main(def args) {
def sw = new StringWriter()
println new XmlTest().xmlTest(sw)
}
def xmlTest(writer) {
def builder = new MarkupBuilder(writer)
builder.root(xmlClosure())
def text = new XmlSlurper().parseText(writer.toString())
def outputBuilder = new StreamingMarkupBuilder()
def result = outputBuilder.bind{ mkp.yield text.x }
return result
}
def xmlClosure() {
return {x("y")}
}
}
Удачи.