本小节讲如何使用dom4j解析一个xml文件
以读取books.xml位例
1.读取并解析XML文档(异常处理省略)
2.得到根节点(异常处理省略)
3.遍历DOM节点
dom4j提供了三种方式来遍历节点
1)已java.util.Iterator<org.dom4j.Element>为工具迭代
解析上文提到的books.xml文件完整的代码
2)递归方式
☆笔者不用这种方式
3)Visitor模式
最令人兴奋的是DOM4J对Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。
了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。
上面的VisitorSupport是一个dom4j提供的Visitor接口的适配器,以便简化代码。
4)xpath方式,这种并不是一种遍历dom树的方式,但是使用起来很方便
参考[url]http://www.iteye.com/wiki/topic/230160[/url]
以读取books.xml位例
<?xml version="1.0" encoding="UTF-8"?>
<books>
<!-- this is a test for dom4j. -->
<book title="My Book">
<author sex="male">
<first-name>Zhuo</first-name>
<last-name>YING</last-name>
</author>
</book>
<book title="Hibernate Document">
<author sex="male">
<first-name>G</first-name>
<last-name>KING</last-name>
</author>
</book>
</books>
1.读取并解析XML文档(异常处理省略)
SAXReader reader = new SAXReader();
Document document = reader.read(url);
2.得到根节点(异常处理省略)
Document document = doc.getRootElement();
3.遍历DOM节点
dom4j提供了三种方式来遍历节点
1)已java.util.Iterator<org.dom4j.Element>为工具迭代
// 枚举所有子节点
for(Iterator i = root.elementIterator(); i.hasNext();) {
Element element = (Element) i.next();
// do something
}
// 枚举所有"foo"子节点
for (Iterator i = root.elementIterator("foo"); i.hasNext();) {
Element foo = (Element) i.next();
// do something
}
// 枚举所有属性
for (Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
解析上文提到的books.xml文件完整的代码
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestLoadXml {
public void load() {
SAXReader saxReader=new SAXReader();
Document doc = null;
try {
doc = saxReader.read(Thread.currentThread().getContextClassLoader().getResource("books.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
if (doc != null) {
Element root = doc.getRootElement();
Iterator<Element> iter = root.elementIterator("book");
while (iter.hasNext()) {
Element e = iter.next();
String title = e.attributeValue("title");
String first = e.element("author").element("first-name").getText();
String last = e.element("author").element("last-name").getText();
String sex = e.element("author").attributeValue("sex");
System.out.println(title + ":" + first + "." + last + "[" + sex + "]");
}
}
}
public static void main(String[] argv) {
new TestLoadXml().load();
}
}
2)递归方式
☆笔者不用这种方式
3)Visitor模式
最令人兴奋的是DOM4J对Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。
了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。
public class MyVisitor extends VisitorSupport {
public void visit(Element element) {
System.out.println(element.getName());
}
public void visit(Attribute attr) {
System.out.println(attr.getName());
}
}
// 调用: root.accept(new MyVisitor())
上面的VisitorSupport是一个dom4j提供的Visitor接口的适配器,以便简化代码。
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
public class TestLoadXML2 {
public void load() {
URL url = Thread.currentThread().getContextClassLoader().getResource(
"books.xml");
SAXReader reader = new SAXReader();
Document doc = null;
try {
doc = reader.read(url);
} catch (DocumentException e) {
e.printStackTrace();
}
if (doc != null) {
doc.accept(new VisitorSupport() {
@Override
public void visit(Element node) {
if (node.getName().equals("book")) {
String title = node.attributeValue("title");
String first = node.element("author").elementText(
"first-name");
String last = node.element("author").elementText(
"last-name");
String sex = node.element("author").attributeValue(
"sex");
System.out.println(title + ":" + first + "." + last
+ "[" + sex + "]");
}
}
});
}
}
public static void main(String[] args) {
new TestLoadXML2().load();
}
}
4)xpath方式,这种并不是一种遍历dom树的方式,但是使用起来很方便
public void bar(Document document) {
List list = document.selectNodes("//foo/bar");
Node node = document.selectSingleNode("//foo/bar/author");
String name = node.valueOf("@name");
}
参考[url]http://www.iteye.com/wiki/topic/230160[/url]