问答详情
源自:-

第四章DOM4J的应用最后一小节里的作业,我用switch来替代之前JDOM4J的if-else语句保存子节点的内容时,为什么会出现保存下来的两本书都是同样的内容?而且内容和节点名不一致。

package Dom4j;

import java.awt.List;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;

import javax.lang.model.element.Element;

import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.w3c.dom.Document;

import com.imooc.entity.Book;

public class DOM4JTest {
	private static ArrayList<Book> bookList = new ArrayList<Book>();
	public static void main(String[] args) {
		//解析book.xml文件
		//创建SAXreader的对象
		SAXReader  reader = new SAXReader();
	
		try {
			//通过reader对象的read方法加载book.xml文件,获取document对象
			org.dom4j.Document document = reader.read(new File("src/res/book.xml"));
			//通过document对象获取根节点bookstore
			org.dom4j.Element bookStore = document.getRootElement();
			//element对象的elementIterator方法获取迭代器
			Iterator it = bookStore.elementIterator();
			//遍历迭代器,获取根节点中的信息
			while(it.hasNext()){
				Book rbook = new Book();
				System.out.println("======开始遍历某一本书======");
				org.dom4j.Element book = (org.dom4j.Element)it.next();
				//获取book的属性名以及属性值
				java.util.List<Attribute> bookAttrs = book.attributes();
				for(Attribute attr : bookAttrs){
					System.out.println("属性名:" + attr.getName() + "--属性值:"
							 + attr.getValue());
					rbook.setId(attr.getValue());
				}
				//获取book的子节点以及其值
				Iterator itt = book.elementIterator();
				while (itt.hasNext()) {
					org.dom4j.Element bookChild = (org.dom4j.Element)itt.next();
					System.out.println("节点名:" + bookChild.getName() + "--节点值:" 
							+ bookChild.getStringValue());
					//根据子节点名称将子节点的内容添加到rbook内相应的变量里
					switch (bookChild.getName()) {
					case "title": rbook.setTitle(bookChild.getStringValue());break;
					case "author": rbook.setTitle(bookChild.getStringValue());break;
					case "year": rbook.setTitle(bookChild.getStringValue());break;
					case "price": rbook.setTitle(bookChild.getStringValue());break;
					case "language": rbook.setTitle(bookChild.getStringValue());break;
					default:break;
					}
				}
				//将获得的子节点加入书单,清除当前实例rbook的内容,并打印出书单的内容
				bookList.add(rbook);
				rbook = null;
				System.out.println("现在书单里有" + bookList.size() + "本书");
				System.out.println("这本书的ID是:" + bookList.get(0).getId());
				System.out.println("书名:" + bookList.get(0).getTitle());
				System.out.println("作者:" + bookList.get(0).getAuthor());
				System.out.println("======结束遍历某一本书======");
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果出来,bookList,也就是保存下来的2个实例对象内容一样,而且和子节点名字不一致。

以下为运行结果

======开始遍历某一本书======

节点名:id--节点值:1

节点名:title--节点值:冰与火之歌

节点名:author--节点值:乔治马丁

节点名:year--节点值:2009

节点名:price--节点值:89

现在书单里有1本书

这本书的ID是:1

书名:89

作者:null

======结束遍历某一本书======

======开始遍历某一本书======

节点名:id--节点值:2

节点名:title--节点值:安徒生童话

节点名:year--节点值:1998

节点名:price--节点值:22

节点名:language--节点值:English

现在书单里有2本书

这本书的ID是:1

书名:89

作者:null

======结束遍历某一本书======


提问者:Raven1 2016-07-15 15:47

个回答

  • Raven1
    2016-07-15 15:52:23

    刚发现了,子节点名字内容不一致是因为我在switch语句里用错了方法,全部用成了setTitle()

    现在还有存下来的两本书都是一样的的问题。