注:需导入jdom相关jar包
package com.suse.jdomtest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import com.suse.entity.Book;
public class JDOMTest {
private static ArrayList<Book> booksList=new ArrayList<Book>();
/**
* @param args
* @throws IOException
* @throws JDOMException
*/
public static void main(String[] args) throws JDOMException, IOException {
// 进行对books.xml文件的JDOM解析
// 1创建一个SAXBuilder对象
SAXBuilder saxBuilder = new SAXBuilder();
// 2创建一个输入流将xml加载到输入流中
InputStream in;
in = new FileInputStream("src/res/books.xml");
InputStreamReader isr = new InputStreamReader(in, "UTF-8");// 处理乱码问题,一个是更改xmL格式
// 而是通过
// InputStreamReader来设置
// 3通过SAXBuilder中的build方法将输入流加载到SAXBuilder中
Document document = saxBuilder.build(isr);
// document getRootElement()获取xml文件的根结点
Element rootElement = document.getRootElement();
// 获取根结点之下的子节点
List<Element> bookList = rootElement.getChildren();
// bookList.size();如果for 循环就要得到要遍历的对象的长度
// 继续进行解析
for (Element book : bookList) {// indexOf(book)过去书的编号从0开始
Book bookEntity=new Book();
System.out.println("开始解析" + (bookList.indexOf(book) + 1)
+ "书==========");
// 解析book的属性集合
List<Attribute> attrList = book.getAttributes();
// book.getAttributeValue("id");//知道结点下名称时
// 遍历attrList(针对不清楚book结点下属性的名字及数量)
for (Attribute attr : attrList) {
// 获取属性名
String attrName = attr.getName();
// 获取属性值
String attrValue = attr.getValue();
System.out.println("属性名:" + attrName + "-------属性值:"
+ attrValue);
if(attrName.equals("id")) {
System.out.println(attrValue);
bookEntity.setId(attrValue);
}
}
// 对book结点的子节点的节点名以及节点的值进行遍历
List<Element> bookChildren = book.getChildren();
for (Element child : bookChildren) {
System.out.println("节点名:" + child.getName() + "------节点值"
+ child.getValue());
if(child.getName().equals("name")) {
bookEntity.setName(child.getValue());}
else if(child.getName().equals("author")){
bookEntity.setAuthor(child.getValue());
}
else if(child.getName().equals("year")) {
bookEntity.setYear(child.getValue());
}
else if(child.getName().equals("price")){
bookEntity.setPrice(child.getValue());
}
else if(child.getName().equals("language")) {
bookEntity.setLanguage(child.getValue());
}
}
System.out.println("结束解析" + (bookList.indexOf(book) + 1)
+ "书==========");
booksList.add(bookEntity);
bookEntity=null;
System.out.println(booksList.size());
System.out.println(booksList.get(0).getId());
System.out.println(booksList.get(0).getName());
}
}
}
package com.suse.entity;
public class Book {
private String id;
private String name;
private String author;
private String year;
private String price;
private String language;
public String getId() {
return id;
}
public void setId(String 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 String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
// 私有属性定义后是外部无法方法的,所以要添加get/set方法,体现了封装的特性
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book id="1">
<name>冰与ç«ä¹‹æŒ</name>
<author>乔治马ä¸</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童è¯</name>
<year>2004</year>
<price>66</price>
<language>English</language>
</book>
</bookstore>
result:
开始解析1书==========
属性名:id——-属性值:1
1
节点名:name——节点值冰与火之歌
节点名:author——节点值乔治马丁
节点名:year——节点值2014
节点名:price——节点值89
结束解析1书==========
1
1
冰与火之歌
开始解析2书==========
属性名:id——-属性值:2
2
节点名:name——节点值安徒生童话
节点名:year——节点值2004
节点名:price——节点值66
节点名:language——节点值English
结束解析2书==========
2
1
冰与火之歌