第四章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
======结束遍历某一本书======