问答详情
源自:4-5 在 JDOM 中存储 Book 对象

运行结果出现

源代码:

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
------结束------

提问者:慕粉3170877 2016-08-17 17:25

个回答

  • 慕粉4353249
    2017-01-11 14:53:29

    正常,因为有两个book节点,节点解析了两次(在for循环中循环了两次),而你的booksList的foreach遍历在这个循环中,所以遍历了两次,而且第一次遍历booksList集合只有第一本书的内容,所以只输出第一本书的内容,第二次遍历有两本书的内容,所以输出两本书的内容,这也是为什么运行结果中生成xml文档的第一本书生成了两遍的原因

  • 静夜夏荷
    2016-08-18 16:51:30

    你的问题是什么?