Смешивание Groovy MarkupBuilder с конвертерами - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь внедрить фрагменты XML, созданные конвертером XML, в MarkupBuilder.

Однако я не могу получить правильное форматирование, и кажется, что есть ненужные промежуточные шаги сериализации.

import grails.converters.XML
import groovy.xml.MarkupBuilder

//...

def writer = new StringWriter ()
def xml = new MarkupBuilder (writer)
xml.response {
   status ("OK")
   myList.each { it as XML } //Insert objects by converting to XML
}
println writer.toString()

Требуемый вывод будет

<response>
  <status>OK</status>
  <foo>
     <field>5</field>
  </foo>
  <foo>
     <field>5</field>
  </foo>
</response>

Моя текущая попытка такая:

def writer = new StringWriter ()
def xml = new MarkupBuilder (writer)
xml.response {
   status ("OK")
   myList.each {
     xml.mkp.yieldUnescaped ( it as XML )
   }
}
println writer.toString()

Однако в настоящее время каждому фрагменту XML предшествует

  <?xml version="1.0" encoding="UTF-8"?>

IsЕсть ли лучший способ достичь этого?

1 Ответ

2 голосов
/ 21 апреля 2011

Отличным способом было бы передать ваш writer напрямую методу render класса XML, как показано ниже.

def writer = new StringWriter ()
def xml = new MarkupBuilder (writer)
xml.response {
   status ("OK")
   def xmlist = myList as XML
   xmlist.render(writer)
}      

Вы по-прежнему будете иметь информацию о кодировке один разхотя, поскольку render просто записывает его в любой переданный writer.

Я вижу 2 варианта избавления от этой информации о кодировке:

  • получить строковое представление XMLкак вы сделали, и удалите информацию о кодировке, как показано ниже (может быть улучшено)
  • напишите свой собственный конвертер XML, используя Groovy MarkupBuilder , как описано в этой статье 1019 *

 xml.response {
    status ("OK")
    def xmlist = myList as XML
    xml.mkp.yieldUnescaped (xmlist.toString() - "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;")
}
...