XML文档解析之JDOM解析

使用JDOM解析需要自己加载相关的jar包,JDOM jar包的下载地址:http://www.jdom.org/downloads/index.html

解析步骤

  1. 创建SAXBuilder对象saxBuilder;
  2. 创建一个文件输入流,并将xml文件加载到输入流中;
  3. 通过saxBuilder的build方法,将输入流加载到saxBuilder的Document的document对象中;
  4. 通过Document的getRootElement方法获取xml文件的根节点;
  5. 使用getChildren方法获取根节点下的所有孩子 节点的List集合;
  6. 对List中的孩子节点集合进行遍历解析。

常用API

No类名称方法名方法说明
1SAXBuilderSAXBuilder()创建SAXBuilder实例对象
2SAXBuilderbuild(InputStream in)将输入流加载到Document的实例对象中
3FIleInputStreamFileInputStream(String filePath)创建文件 输入流
4DocumentgetRootElement()获取xml文件的根节点
5ElementgetChildren()获取该节点的全部孩子节点列表
6ElementgetName()获取节点或属性名称
7ElementgetValue()获取节点或属性值
8ElementgetAttributes()获取该节点的全部属性列表

注:\color{red}{getValue()函数与DOM解析的getNodeValue()存在很大的区别,getValue()函数不区分Element节点和text节点,都能取得数据,且不包含空格换行等text节点的内容。

待解析文件

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
    <book id = "1">
        <name>冰与火之歌</name>
        <author>乔治马丁</author>
        <year>2014</year>
        <price>89</price>
    </book>
    <book id = "2">
        <name>安徒生童话</name>
        <year>2004</year>
        <price>77</price>
        <language>English</language>
    </book>
</bookstore>

book结构

package XML;

/**
 * Created by lin_y on 2017/6/18.
 */
public class Book {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String name;
    private String author;
    private String year;
    private double price;
    private String language;

    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 String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", year='" + year + '\'' +
                ", price=" + price +
                ", language='" + language + '\'' +
                '}';
    }
}

解析代码

package XML;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * Created by lin_y on 2017/6/19.
 */
public class XMLJDOM {
    private List<Book> books = new ArrayList<Book>();

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(Book book){
        this.books.add(book);
    }

    public static void main(String [] args) throws Exception{
        XMLJDOM xmlJdom = new XMLJDOM();
        // 1.创建SAXBuilder对象
        SAXBuilder saxBuilder = new SAXBuilder();
        // 2. 创建一个文件输入流,并将xml文件加载到输入流中
        InputStream in = new FileInputStream("xml/book.xml");
        // 3. 通过saxBuilder的build方法,将输入流加载到saxBuilder中
        Document document = saxBuilder.build(in);
        // 4. 通过document对象获取xml文件的根节点
        Element rootElement = document.getRootElement();
        // 5. 获取根节点下的子节点的List集合
        List<Element> bookList = rootElement.getChildren();
        // 继续进行解析
        for(Element book : bookList){
            // 解析book的属性
            Book bookEntity = new Book();
            List<Attribute> attributesList = book.getAttributes();
            for(Attribute attr : attributesList){
                if("id".equals(attr.getName())){
                    bookEntity.setId(attr.getValue());
                }
            }
            // 对book节点的子节点的节点名及节点值的遍历
            List<Element> bookChildren = book.getChildren();
            for(Element bookChild : bookChildren){
                String nodeName = bookChild.getName();
               switch(nodeName){
                   case "name":
                       bookEntity.setName(bookChild.getValue());
                       break;
                   case "author":
                       bookEntity.setAuthor(bookChild.getValue());
                       break;
                   case "year":
                       bookEntity.setYear(bookChild.getValue());
                       break;
                   case "price":
                       bookEntity.setPrice(Double.parseDouble(bookChild.getValue()));
                       break;
                   case "language":
                       bookEntity.setLanguage(bookChild.getValue());
                       break;
               }
            }
           xmlJdom.setBooks(bookEntity);
        }
        Iterator<Book> bookIterator = xmlJdom.getBooks().iterator();
        while(bookIterator.hasNext()){
            System.out.println(bookIterator.next());
        }
    }
}

程序运行结果

这里写图片描述

乱码问题

有两种方式解决乱码问题:
1. 在xml文件中指定对应的编码方式。
这里写图片描述
2. 将字节输入流转换成指定编码格式的字符输入流。

InputStream in = new FileInputStream("book.xml");
InputStreamReader cin = new InputStreamReader(in, "UTF-8");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值