如何使用groovy解析xml文件时建模java类
问题描述:
我有一个带有大量标签和子标签的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的方法。有没有更简单的方法来做到这一点。
答
您可以使用jaxb。它在字段上使用注释。我认为你也可以让jaxb从示例xm l文件创建java类。
答
如果您必须解析许多书籍,则可以遍历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
}
答
另一种选择,就是只有在相同的命名属性在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
的,我需要一个XSD这我没有 – sparkle 2012-02-04 15:13:17
@ 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