把上面import引入的
org.jdom.Attribute;
删除,然后重新引入dom4j
百度啊。。。。。
或许可以尝试写一个递归来不断获取子节点,直到获取最下面的叶子节点
这个是Java awt组件里面的包,你要导入的是你自己建立的Book类对象所在的包。
这两个getName()是不同的,第一个是Attribute类的getName()方法,第二个是Element类的getName()方法
如果你想输出book节点名,可以用book.getName()输出
在这里的效果是一样的,在实际应用的时候可以根据自己的需求选择这两种方式
package com.test; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class DOM4JTest { private static List<Book> books = new ArrayList<Book>(); public static void main(String[] args) { // 解析books.xml SAXReader reader = new SAXReader(); try { Document document = reader.read(new File("src/res/books.xml")); Element bookStore = document.getRootElement(); Iterator it = bookStore.elementIterator(); while(it.hasNext()){ Book bookEntity = new Book(); Element book = (Element)it.next(); List<Attribute> bookAttrs = book.attributes(); for (Attribute attr : bookAttrs) { System.out.println(attr.getName()+"->"+attr.getValue()); if(attr.getName().equals("id")){ bookEntity.setId(attr.getValue()); } } Iterator itt = book.elementIterator(); while(itt.hasNext()){ Element bookChild = (Element)itt.next(); System.out.println(bookChild.getName()+"->"+bookChild.getStringValue()); switch (bookChild.getName()) { case "name": bookEntity.setName(bookChild.getStringValue()); break; case "author": bookEntity.setAuthor(bookChild.getStringValue()); break; case "year": bookEntity.setYear(bookChild.getStringValue()); break; case "price": bookEntity.setPrice(bookChild.getStringValue()); break; case "language": bookEntity.setLanguage(bookChild.getStringValue()); break; default: break; } } books.add(bookEntity); bookEntity=null; System.out.println("--------------------------------"); } for (Book book : books) { System.out.println(book.toString()); System.out.println("--------------------------------"); } } catch (DocumentException e) { e.printStackTrace(); } } }
list = document.selectNodes("/bookstore/book")
可以使用这样的方式获取子节点,比如这种就是获得所有的bookstore节点下的所以book节点
空指针异常
没区别,不同方法而已,殊途同归
上面通过book.attributes();获得的是属性值,在本节也就是id,而它的子节点下面是没有任何属性值的,所以肯定得到的是空的