使用JDOM解析需要自己加载相关的jar包,JDOM jar包的下载地址:http://www.jdom.org/downloads/index.html。
解析步骤
- 创建SAXBuilder对象saxBuilder;
- 创建一个文件输入流,并将xml文件加载到输入流中;
- 通过saxBuilder的build方法,将输入流加载到saxBuilder的Document的document对象中;
- 通过Document的getRootElement方法获取xml文件的根节点;
- 使用getChildren方法获取根节点下的所有孩子 节点的List集合;
- 对List中的孩子节点集合进行遍历解析。
常用API
No | 类名称 | 方法名 | 方法说明 |
---|---|---|---|
1 | SAXBuilder | SAXBuilder() | 创建SAXBuilder实例对象 |
2 | SAXBuilder | build(InputStream in) | 将输入流加载到Document的实例对象中 |
3 | FIleInputStream | FileInputStream(String filePath) | 创建文件 输入流 |
4 | Document | getRootElement() | 获取xml文件的根节点 |
5 | Element | getChildren() | 获取该节点的全部孩子节点列表 |
6 | Element | getName() | 获取节点或属性名称 |
7 | Element | getValue() | 获取节点或属性值 |
8 | Element | getAttributes() | 获取该节点的全部属性列表 |
注:\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");