Java——DOM4J解析XML文件

跟前几篇文章一样,依旧使用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]]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值