Какой хороший способ сделать XML с помощью Grails

Краткий поиск в Google выглядит так, как будто вы должны использовать "MarkupBuilder", но я этого не понимаю. Похоже, я могу сделать "как XML", сделав import grails.converters.XML но это на самом деле не дает мне то, что я хочу.

Я хочу этот:

<Thingie>
  <someValue>blah</someValue>
  <hellaItems>
    <Item>
      <anotherValue>yaddayadda</anotherValue>
    </Item>
    <Item>
      <anotherValue>different from the first</anotherValue>
    </Item>
  </hellaItems>

</Thingie> 

Я даже не знаю с чего начать...

@ Стефан, что если я хочу сделать это динамически? Я не думаю, что понимаю, что "строители" вообще могут быть проблемой.

def items = ["yaddayadda","different from the first"]

Обновление: похоже, я уже близко, но может кто-нибудь помочь мне с этой последней частью. Я делаю это:

def items = ["yaddayadda","different from the first"]
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.thingie() {
  someValue('blah')
  hellaItems(){
      items.each{
          item(){
              anotherValue(it)
           }
      }


  }
}
def xmlString = writer.toString()
println "maybe this will just work"
println xmlString

печатает:

maybe this will just work
<thingie>
  <someValue>blah</someValue>
  <hellaItems>
    <item>
      <anotherValue />
    </item>
    <item>
      <anotherValue />
    </item>
  </hellaItems>
</thingie>

Почему не мой anotherValueтам?

ОБНОВЛЕНИЕ: РЕШЕНО с использованием "tmpHolder" ниже, однако у Билла есть лучший синтаксис.

def items = ["yaddayadda","different from the first"]
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.thingie() {
  someValue('blah')
  hellaItems(){
      items.each{
          def tmpHolder = it
          item(){
              anotherValue(tmpHolder)
           }
      }


  }
}
def xmlString = writer.toString()
println "maybe this will just work"
println xmlString

2 ответа

Решение
import groovy.xml.MarkupBuilder

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.thingie() {
  someValue('blah')
  hellaItems(){
     item(){
        anotherValue('yaddayadda')
     }
     item(){
        anotherValue('different from the first')
     }
  }
}

writer.toString()

Что ты не получишь? Синтаксис немного странный, но это потому, что это DSL. Это не должно выглядеть как обычный "код". as XML работает совсем по-другому, и если ваш объектный граф не будет точно соответствовать XML, который вы опубликовали, вы не получите желаемых результатов.

По сути, если вам нужен детальный контроль над сгенерированным XML, используйте MarkupBuilder, Если вы хотите сериализовать в XML объект (граф) способом по умолчанию, т.е. все свойства включены в разметку, то не стесняйтесь использовать someObject as XML

Другие вопросы по тегам