Apache-dom4j的使用(二)

本小节讲如何使用dom4j解析一个xml文件

以读取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");
}


参考 http://www.iteye.com/wiki/topic/230160

你可能感兴趣的:(java,apache,设计模式,thread,xml)