跟前几篇文章一样,依旧使用books.xml和Book类,直接给出代码:
package domain;
public class Book {
private int id;
private String name;
private String author;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + "]";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<author>安徒生</author>
<price>24</price>
</book>
</bookstore>
由于DOM4J并不是Java官方提供的解析方式,所有要使用DOM4J解析XML文件,首先需要下载DOM4J的JAR包。(谷歌一下即可)
创建好books.xml与Book类,并将DOM4J的JAR包引入工程后,准备工作就做好了。
下面开始实现解析工具类:
首先需要创建SAXReader类的对象:
// 创建SAXReader对象
SAXReader reader = new SAXReader();
将XML文件加载到SAXReader对象的read()方法中去:
// 将XML文件加载到reader的read()方法中去
Document document = reader.read(file);
获取XML文件的根节点:
// 获取XML文件的根节点
Element root = document.getRootElement();
获取根节点下的所有子节点:
// 获取根节点下的所有子节点
Iterator<Element> booksIterator = root.elementIterator();
至此,我们就得到了所有的子节点(book),接下来,就是对这些子节点逐个进行解析。
通过节点的attributes()
方法可以获取到该节点的所有属性,通过属性的getName()
和getValue()
方法可以获取每个属性的名称和值。
通过节点的getName()
方法可以获取到每个节点的名称,通过getStringValue()
方法可以获取到节点的值。再将值封装到Book对象相应的属性中即可。
// 遍历每一个子节点
while (booksIterator.hasNext()) {
Book aBook = new Book();
Element book = booksIterator.next();
// 遍历该节点的所有属性
List<Attribute> attrs = book.attributes();
for (Attribute attribute : attrs) {
switch (attribute.getName()) {
case "id":
aBook.setId(Integer.valueOf(attribute.getValue()));
break;
}
}
//遍历该节点的所有子节点
Iterator<Element> children = book.elementIterator();
while(children.hasNext()){
Element child = children.next();
switch(child.getName()){
case "name":
aBook.setName(child.getStringValue());
break;
case "author":
aBook.setAuthor(child.getStringValue());
break;
case "price":
aBook.setPrice(Integer.valueOf(child.getStringValue()));
break;
}
}
booksList.add(aBook);
}
下面是完整的工具类:
package util;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import domain.Book;
public class ParseUtil {
private List<Book> booksList = new ArrayList<Book>();
public void parseXMLByDOM4J(File file) {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
try {
// 将XML文件加载到reader的read()方法中去
Document document = reader.read(file);
// 获取XML文件的根节点
Element root = document.getRootElement();
// 获取根节点下的所有子节点
Iterator<Element> booksIterator = root.elementIterator();
// 遍历每一个子节点
while (booksIterator.hasNext()) {
Book aBook = new Book();
Element book = booksIterator.next();
// 遍历该节点的所有属性
List<Attribute> attrs = book.attributes();
for (Attribute attribute : attrs) {
switch (attribute.getName()) {
case "id":
aBook.setId(Integer.valueOf(attribute.getValue()));
break;
}
}
//遍历该节点的所有子节点
Iterator<Element> children = book.elementIterator();
while(children.hasNext()){
Element child = children.next();
switch(child.getName()){
case "name":
aBook.setName(child.getStringValue());
break;
case "author":
aBook.setAuthor(child.getStringValue());
break;
case "price":
aBook.setPrice(Integer.valueOf(child.getStringValue()));
break;
}
}
booksList.add(aBook);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public List<Book> getBooksList() {
return booksList;
}
public void setBooksList(List<Book> booksList) {
this.booksList = booksList;
}
}
测试结果如下:
[Book [id=1, name=冰与火之歌, author=乔治马丁, price=89.0], Book [id=2, name=安徒生童话, author=安徒生, price=24.0]]