Как смоделировать Java-класс при разборе XML-файла с помощью groovy - PullRequest
0 голосов
/ 04 февраля 2012

У меня есть XML-файл с большим количеством тегов и вложенных тегов. Я хочу смоделировать этот XML-файл в классе Java. Например, для приведенного ниже XML-файла я хочу создать отдельный класс книги с названием автора n в качестве поля.

class Book{
private string title;
private String author
}

Для разбора я использую следующий код

def catalogue= new XmlParser().parse(file)

Book b =new Book()
b.setTitle(catalogue.book.title.text())
b.setAuthor(catalogue.book.author.text())

Пример XML-файла

<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
   </book>
</catalog>

У меня вопрос: если файл xml содержит много тегов n подтегей, то ручная установка значения каждого поля класса не является подходом gud. Есть более короткий способ сделать это.

Ответы [ 3 ]

1 голос
/ 05 февраля 2012

Если вам нужно разобрать много книг, вы можете перебирать теги <book> в своем XML. Например:

import groovy.transform.Canonical

@Canonical
class Book {
    String title, author
}

def text = """
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
   </book>
   <book id="bk102">
      <author>Orwell, George</author>
      <title>1984</title>
   </book>
   <book id="bk103">
      <author>Huxley, Aldous</author>
      <title>Brave New World</title>
   </book>
</catalog>
"""

def catalog = new XmlParser().parseText(text)
def books = catalog.book.collect {
    new Book(title: it.title.text(), author: it.author.text())
}

println books

... выходы [Book(XML Developer's Guide, Gambardella, Matthew), Book(1984, Orwell, George), Book(Brave New World, Huxley, Aldous)]

Обратите внимание, что я использую преобразование @Canonical, но это просто бесплатный метод toString():)

Обновление : Извините, я не заметил, что класс Book находится на Java. Я полагаю, вы не можете коснуться этого. Но, тем не менее, вы можете разобрать этот xml с помощью:

def catalog = new XmlParser().parseText(text)
def books = catalog.book.collect {
    def b = new Book()
    b.setAuthor(it.author.text())
    b.setTitle(it.title.text())
    b
}
1 голос
/ 04 февраля 2012

Вы можете использовать jaxb.Он использует аннотации на полях.Я думаю, что вы также можете заставить jaxb создать класс java из образца файла xm l.

0 голосов
/ 06 февраля 2012

Другой вариант - установить свойства объекта Book только в том случае, если в XML-файле существуют такие же именованные свойства ...

Таким образом, при наличии такого XML-файла (и класса Java * 1003)* как вы указали в вопросе):

def xml = '''<catalog>
            |  <book id="bk101">
            |    <author>Gambardella, Matthew</author>
            |    <title>XML Developers Guide</title>
            |  </book>
            |  <book id="bk102">
            |    <author>Yates, Tim</author>
            |    <title>Munging XML with Groovy</title>
            |  </book>
            |</catalog>'''.stripMargin()

Вы можете сгенерировать список Book объектов (задающих поля, существующие в xml), например:

def bookList = new XmlParser().parseText( xml ).with { doc ->
  doc.book.collect { xmlbook ->
    new Book().with { book ->
      xmlbook.children()*.name().intersect( Book.declaredFields.grep { !it.synthetic }.name ).each { field ->
        book.@"$field" = xmlbook."$field".text()
      }
      book
    }
  }
}

Затем, чтобы распечатать bookList, мы получим:

bookList.each {
  println "Book author:$it.author, title:$it.title"
}

Какие отпечатки:

Book author:Gambardella, Matthew, title:XML Developers Guide
Book author:Yates, Tim, title:Munging XML with Groovy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...