Как преобразовать XML-файлы в groovy синтаксис из командной строки

#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>