慕粉3170877
2016-08-17 17:25
源代码:
package com.imooc.jdotest;
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;
public class JdomTest {
private static ArrayList<Book> booksList=new ArrayList<Book>();
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.创建SAXBuilder对象
SAXBuilder saxBuilder=new SAXBuilder();
//2.创建输入流,将xml文件加载到输入流中
InputStream in;
try {
//in = new FileInputStream("f:\\books.xml");
in = new FileInputStream("src/res/books.xml");//注意是右斜扛
//如果出现乱码问题时,应该利用InputStreamReader解决乱码问题
InputStreamReader isr=new InputStreamReader(in, "UTF-8");
//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 bookEntity=new Book();
System.out.println("开始解析第"+(bookList.indexOf(book)+1)+"本书!");
List<Attribute> attribute=book.getAttributes();
for(Attribute attr:attribute){
System.out.println("属性名:"+attr.getName()+"----属性值:"+attr.getValue());
if(attr.getName().equals("id")){
bookEntity.setID(attr.getValue());
}
}
//解析节点名和节点值
List<Element> bookChilds= book.getChildren();
for(Element child:bookChilds){
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()+"本书!");
for(Book book1:booksList){
System.out.println("------开始------");
System.out.println(book1.getID());
System.out.println(book1.getName());
System.out.println(book1.getAuthor());
System.out.println(book1.getYear());
System.out.println(book1.getPrice());
System.out.println(book1.getLanguage());
System.out.println("------结束------");
}
}
}catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
开始解析第1本书!
属性名:id----属性值:1
节点名是:name----节点值是:老人与海
节点名是:author----节点值是:海明威
节点名是:year----节点值是:2015
节点名是:price----节点值是:67
结束解析第1本书!
共有1本书!
------开始------
1
老人与海
海明威
2015
67
null
------结束------
开始解析第2本书!
属性名:id----属性值:2
节点名是:name----节点值是:看见
节点名是:language----节点值是:Chinses
节点名是:author----节点值是:柴静
节点名是:year----节点值是:2014
节点名是:price----节点值是:87
结束解析第2本书!
共有2本书!
------开始------
1
老人与海
海明威
2015
67
null
------结束------
------开始------
2
看见
柴静
2014
87
Chinses
------结束------
正常,因为有两个book节点,节点解析了两次(在for循环中循环了两次),而你的booksList的foreach遍历在这个循环中,所以遍历了两次,而且第一次遍历booksList集合只有第一本书的内容,所以只输出第一本书的内容,第二次遍历有两本书的内容,所以输出两本书的内容,这也是为什么运行结果中生成xml文档的第一本书生成了两遍的原因
你的问题是什么?
Java眼中的XML---文件读取
83199 学习 · 431 问题
相似问题