Могу ли я передать разметку Groovy список узлов? - PullRequest
3 голосов
/ 01 октября 2009

Я делаю некоторую обработку XML с помощью groovy. В частности, я вдыхаю XML-файл через XMLParser, выполняю целый пакет обработки в памяти, а затем сериализую получаемые данные обратно в XML через MarkupBuiler.

Подавляющее большинство данных в файле передается в иерархию объектов не на основе xml для общения с графическим интерфейсом и выполнения обработки, поэтому два XML-файла никогда не узнают друг о друге.

Однако существует один фрагмент XML, который находится на краю исходного файла, который необходимо дословно скопировать в выходной файл XML практически без обработки. Есть ли способ, которым я могу передать MarkupBuilder список узлов из XMLParser и просто вставить его в документ?

Примерно так:

def builder = new MarkupBuilder()
builder.outermosttag( name: 'library') {
  someothertag( name: 'shelf' ) {

    //magically insert a nodelist of arbitrary XML from somewhere else

  }
}

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

XmlParser возвращает узел, и я не знаю ни одного способа вставить его в разметку или StreamingMarkupBuilder без преобразования в строку xml.

import groovy.xml.*

def x = """
<root>
  <somenode1>
      <anode>foo</anode>
  </somenode1>
  <somenode2>
      <anode>bar</anode>
  </somenode2>
</root>
""".trim()
def otherXml = new XmlParser().parseText(x)

def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(otherXml.somenode1[0])

def builder = new MarkupBuilder()
builder.outermosttag( name: 'library') {
  someothertag( name: 'shelf' ) {

    mkp.yieldUnescaped writer.toString() //magically insert a nodelist of arbitrary XML from somewhere else

  }
}

Для такой работы я склонен использовать XmlSlurper вместе с StreamingMarkupBuilder:

import groovy.xml.*

def x = """
<root>
  <somenode1>
      <anode>foo</anode>
  </somenode1>
  <somenode2>
      <anode>bar</anode>
  </somenode2>
</root>
""".trim()
def otherXml = new XmlSlurper().parseText(x)

def builder = new StreamingMarkupBuilder().bind {
    outermosttag( name: 'library') {
        someothertag( name: 'shelf' ) {

            mkp.yield otherXml.somenode1 //magically insert a nodelist of arbitrary XML from somewhere else

        }
    }
}
1 голос
/ 11 февраля 2011

Вот как я могу вставить список узлов DOM посередине, используя DOMBuilder.

def nodelist = getFromSomewhereElse()
builder.outermosttag( name: 'library') {
  someothertag( name: 'shelf' ) {
    nodelist.each{ delegate.current.appendChild(it) }
  }
}
0 голосов
/ 01 октября 2009

Я на самом деле не пробовал это ... но если вы сериализовали список узлов в строку, вы могли бы сделать это:

builder.yieldUnescaped(xmlString)

все еще немного грязно, хотя ...

...