2012-02-04 28 views
0

我有一個帶有大量標籤和子標籤的xml文件。我想在java類中對該xml文件建模。例如,對於下面的xml文件,我想創建具有author n title作爲字段的單獨的book類。如何使用groovy解析xml文件時建模java類

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文件包含大量標籤正子標籤,然後手動設置值每個班級的領域不是一個gud的方法。有沒有更簡單的方法來做到這一點。

回答

1

您可以使用jaxb。它在字段上使用註釋。我認爲你也可以讓jaxb從示例xm l文件創建java類。

+0

的,我需要一個XSD這我沒有 – sparkle 2012-02-04 15:13:17

+0

@ user598159 - JAXB(JSR-222)實現不需要XML模式(http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics)。 EclipseLink JAXB(MOXy)提供XPath映射作爲擴展(http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html) – 2012-02-04 21:05:40

1

如果您必須解析許多書籍,則可以遍歷XML上的<book>標記。例如:

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 
} 
0

另一種選擇,就是隻有在相同的命名屬性在XML文件中存在Book對象設置的屬性...

因此,考慮到一個XML文件中像這樣(和Java,你在問題中指定的類Book):

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 -> 
     [email protected]"$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