DOM4J同样也是一种针对Java的XML解析技术。
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。现如今,越来越多的Java软件都在使用DOM4J来读写XML,比如Hibernation中配置文件的解析是用DOM4J.
DOM4J解析XML步骤:
0. 添加DOM4J的jar包。点击这里跳转到DOM4J官网
1. 创建SAXReader的对象reader
2. 通过reader对象的reader方法,加载xml文件,获取document对象
3. 通过document对象获取根节点
4. 通过element对象的elementIterator方法获取迭代器
5. 遍历迭代器,获取根节点中的信息
6. 通过对根节点的再迭代,获取子节点的信息
举个例子:
在下面的这个程序中,解析一个books.xml文件,并将属性值保存到book实体类对象的List中
public class DOM4JTest {
private static List<Book> booksList = new ArrayList<Book>();
public static void main(String[] args) {
//1、创建SAXReader的对象reader
SAXReader reader = new SAXReader();
try {
//2、通过reader对象的reader方法,加载xml文件,获取document对象
Document document = reader.read(new File("src/res/books.xml"));
//3、通过document对象获取根节点
Element bookstore = document.getRootElement();
//4、通过element对象的elementIterator方法获取迭代器
Iterator it = bookstore.elementIterator();
//5、遍历迭代器,获取根节点中的信息
while (it.hasNext()) {
Book bookEntity = new Book();
System.out.println("=========开始遍历某一本书========");
Element book = (Element) it.next();
//获取book的属性名以及 属性值
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());
if (bookChild.getName().equals("name")) {
bookEntity.setName(bookChild.getStringValue());
}else if(bookChild.getName().equals("author")){
bookEntity.setAuthor(bookChild.getStringValue());
}else if(bookChild.getName().equals("year")){
bookEntity.setYear(bookChild.getStringValue());
}else if(bookChild.getName().equals("price")){
bookEntity.setPrice(bookChild.getStringValue());
}else if(bookChild.getName().equals("language")){
bookEntity.setLanguage(bookChild.getStringValue());
}
}
System.out.println("=========结束遍历某一本书========");
booksList.add(bookEntity);
bookEntity=null;
}
for (Book bk : booksList) {
System.out.println(bk.toString());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
运行结果: