XML-сортировка вложенных элементов в Grails с использованием синтаксиса Groovy-разметки

Grails: v2.5.0

Как я могу генерировать XML, включая вложенные элементы без атрибутов?

Это мой желаемый результат:

<?xml version="1.0" encoding="UTF-8"?>
<list>
  <book>
    <title>Title</title>
    <authors>
      <author>
        <fname>First Name</fname>
        <lname>Last Name</lname>
      </author>
    </authors>
  </book>
</list>

Используя следующий маршаллер...

// imports...

class BootStrap {

  def init = { servletContext ->
    XML.registerObjectMarshaller(Book) { Book book, converter ->
      converter.build {
        title book.title
        authors {
          for (a in book.authors) {
            author {
              fname a.fname
              lname a.lname
            }
          }
        }
      }
    }
  }
}

... authors элемент не включен в вывод:

<?xml version="1.0" encoding="UTF-8"?>
<list>
  <book>
    <title>Title</title>
  </book>
</list>

Однако при добавлении атрибута к authors а также author элементы...

// imports...

class BootStrap {

  def init = { servletContext ->
    XML.registerObjectMarshaller(Book) { Book book, converter ->
      converter.build {
        title book.title
        authors(bla: 'bla') {
          for (a in book.authors) {
            author(bla: 'bla') {
              fname a.fname
              lname a.lname
            }
          }
        }
      }
    }
  }
}

... элементы включены в вывод:

<?xml version="1.0" encoding="UTF-8"?>
<list>
  <book>
    <title>Title</title>
    <authors bla="bla">
      <author bla="bla">
        <fname>First Name</fname>
        <lname>Last Name</lname>
      </author>
    </authors>
  </book>
</list>

Может ли кто-нибудь указать мне правильное направление?

Спасибо!

2 ответа

Решение

Нашел решение: добавьте скобки и пустой список.

Вот код:

// imports...

class BootStrap {

  def init = { servletContext ->
    XML.registerObjectMarshaller(Book) { Book book, converter ->
      converter.build {
        title book.title
        authors([]) {
          for (a in book.authors) {
            author([]) {
              fname a.fname
              lname a.lname
            }
          }
        }
      }
    }
  }
}

Добавьте пустые скобки к авторам и вызовам авторов следующим образом:

    converter.build {
      title book.title
      authors() {
        for (a in book.authors) {
          author() {
            fname a.fname
            lname a.lname
        }
      }
    }

Посмотрите этот ТАК вопрос с примером.

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