Groovy MarkupBuilder
У меня есть список вещей, каждая из которых может быть foo или бар. Я хочу создать XML, который выглядит следующим образом:
<rdf:RDF>
<foo id="1">
<foo id="2">
<bar id="3">
</rdf:RDF>
Итак, я получил это далеко:
MarkupBuilder xml = new MarkupBuilder(writer)
xml.'rdf:RDF' (nsmap) { }
Но сейчас я застрял. Как я - в этом xml.'rdf:RDF' (nsmap) { }
закрытие - перебрать мой список вещей? Как я - внутри этого итератора - выплюнуть элемент foo или bar, если применимо?
3 ответа
Это проще, как вы думаете. Включите цикл в закрытие xml и, в свою очередь, включите разметку в цикл. Этот скрипт...
import groovy.xml.MarkupBuilder
things = ['foo','foo','bar']
writer = new StringWriter()
xml = new MarkupBuilder(writer)
xml.'rdf:RDF' {
things.eachWithIndex {thing,index ->
"$thing" id:index+1
}
}
println writer
... выдаст следующий вывод:
<rdf:RDF>
<foo id='1' />
<foo id='2' />
<bar id='3' />
</rdf:RDF>
Ну вот:
import groovy.xml.MarkupBuilder
import org.custommonkey.xmlunit.*
def data = [foo:1,bar:2,baz:3]
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.'rdf:RDF' {
data.each { e ->
"$e.key"(id:e.value)
}
}
println writer
Хорошо.
Проблема заключается в том, что когда замыкатель запускается компоновщиком, он работает в контексте компоновщика. Теперь выясняется, что контекст компоновщика скрывает методы, но не скрывает переменные. Это означает, что вы можете создать замыкание, назначить его переменной и получить доступ к нему из компоновщика.
Теперь у меня сложилось впечатление, что это замыкание тоже работает в контексте компоновщика. Но я подозреваю, что вы можете присвоить "this" переменной вне замыканий, а затем получить доступ к этой переменной, чтобы получить контекст обратно.
Смешно, что тебе приходится идти на такие неприятности. Мне напомнили о кодировании в Microsoft Access, еще в 90-х. Он прекрасно работает до того момента, когда вы захотите сделать что-то большее, чем это было строго разработано.