#xml #groovy
#xml #groovy
Вопрос:
есть ли какой-либо способ преобразовать XML-файл в groovy синтаксис для использования в Xml MarkupBuilder? Например: foo.xml файл выглядит следующим образом:
<foo attribute1="value1" attribute2="value2">
<nestedFoo>
sampleText
</nestedFoo>
</foo>
Затем выполните командную строку, которую я ищу:
<command line> foo.xml foo.groovy
foo.groovy будет выглядеть примерно так:
foo(attribute1:'value1', attribute2:'value2') {
nestedFoo('sampleTest')
}
Большое вам спасибо.
Комментарии:
1. Вы хотите преобразовать xml в скрипт groovy, который будет генерировать xml при запуске?
Ответ №1:
Я придумал это:
Приведен некоторый пример XML:
def xml = """<foo attribute1="value1" attribute2="value2">
<nestedFoo>
sampleText
</nestedFoo>
</foo>"""
Затем мы можем проанализировать его в using XmlParser
и работать с узлами, записывая данные в writer
def s = new XmlParser().parseText( xml )
// Closure for writing the xml to a writer as Groovy
// builder style code
def dumpNode
dumpNode = { node, writer, indent = ' ' ->
// Contents of the node, followed by the attributes
def attrs = node.text()?.trim()
attrs = attrs ? [ "'$attrs'" ] : []
attrs = node.attributes().inject( attrs ) { a, v ->
a << "$v.key:'$v.value'"
}.join( ', ' )
// write out the method definition
writer << "${indent}${node.name()}( $attrs )"
writer << ' {n'
node.children().each {
if( it instanceof Node ) dumpNode( it, writer, " $indent" )
}
writer << "$indent}n"
}
def sw = new StringWriter()
sw << 'println new StringWriter().with { out ->n'
sw << ' new groovy.xml.MarkupBuilder( out ).with { smb ->n'
dumpNode( s, sw )
sw << ' }n'
sw << ' out.toString()n'
sw << '}n'
println sw
Запустив этот код, выводит:
println new StringWriter().with { out ->
new groovy.xml.MarkupBuilder( out ).with { smb ->
foo( attribute1:'value1', attribute2:'value2' ) {
nestedFoo( 'sampleText' ) {
}
}
}
out.toString()
}
Затем, если вы запустите это в Groovy, вы получите:
<foo attribute1='value1' attribute2='value2'>
<nestedFoo>sampleText</nestedFoo>
</foo>