Какой хороший способ сделать XML с Grails - PullRequest
3 голосов
/ 14 июля 2011

Краткий поиск в 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 ]

3 голосов
/ 14 июля 2011
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, который вы ввели, вы не получите желаемых результатов.

0 голосов
/ 14 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...