dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
而学习java的时候,我们免不了就是大堆小堆的配置文件,那么如何读取配置文件呢。
dom4j-1.6.1.jar
jaxen-1.1-beta-6.jar
下载地址:http://sourceforge.net/projects/dom4j/files/latest/download
我用的是MyEclipse新建了一个普通的java项目,然后新建一个lib文件,把上边的两个jar包放进去,然后右键--》build path--》Add to Bulid Path,这样我们src下的类文件就可以使用了。
读取得先有一个XML文件不是,所以先给大家XML文件
1
7891
sdffff
job
2010-1-1
5000.00
1000.00
2
7369
SMITH
CLERK
7902
1980-12-17
800.00
20
百度
孟海滨博客
首先要读取一个XML文件,你得先找到他,那么找到他的方法就如下
/**
* 根据地址获得一个Document(XML文件)
* @param url 地址
* @return Docuyment
* @throws DocumentException
*/
public Document parse(String url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
找到以后呢,当然是找到了文档,我们就要读取礼拜的数据,或者找节点。这里我们写了几个找节点的方法,从而获得他们所有的节点,用了迭代器来循环。分别是找到根节点,找到跟元素为'foo'的元素,找到子节点的属性。
/**
* 找Document里的元素
* @param document
* @throws DocumentException
*/
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
//获得根节点
for( Iterator itr = root.elementIterator(); itr.hasNext();){
Element element = (Element)itr.next();
//TODO
}
//遍历子元素的根元素名称“foo”的节点
for ( Iterator i = root.elementIterator("foo"); i.hasNext();){
Element foo = (Element)i.next();
//TODO
}
//遍历子元素的属性
for (Iterator i = root.attributeIterator(); i.hasNext();){
Attribute attribute = (Attribute) i.next();
//TODO
}
}
上边是找到了所有的节点,那么我们当然是要获取节点里边的值的,就好像我们链接数据库,绝对不是找到那张表就可以了,而是需要礼拜的数据,而获取数据也分为两种,获取单一的某一个节点(Node)的值和获取所有节点的值。
获取单一节点的值
/**
* 读取文档中某一个节点的值
* @param document
* @throws DocumentException
*/
public void barXPath(Document document) throws DocumentException{
List list = document.selectNodes("//ROWDATA/ROW");
Node node = document.selectSingleNode("//ROWDATA/ROW/ENAME");
System.out.println("node1 = " + node.getStringValue());
}
获取所有节点的值(for循环)
/**
* 循环遍历每一个节点
* @param element
*/
public void treeWalk(Element element) {
for ( int i=0, size = element.nodeCount(); i < size; i++){
Node node = element.node(i);
if (node instanceof Element ) {
treeWalk ((Element)node);
System.out.println("node = " + node.getText());
}
else {
//do something
}
}
}
当然也有一种获取一个节点的属性值,例如我们在HTML中都有链接孟海滨博客,那我如何获得链接呢。代码如下
/**
* 读取文档中的链接
* @param document
* @throws DocumentException
*/
public void findLink(Document document) throws DocumentException {
List list = document.selectNodes("//a/@href");
for( Iterator iter = list.iterator(); iter.hasNext();) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
System.out.println("url = " + url.toString());
}
}
创建Document
/**
* 创建一个Document的文本
* @return
*/
public Document createDocument() {
//创建document
Document document = DocumentHelper.createDocument();
//创建根元素
Element root = document.addElement("root");
//添加子节点1和设置属性
Element auther1 = root.addElement("auther")
.addAttribute("name", "James")
.addAttribute("location", "UK")
.addText("James SXtrachan");
//添加子节点2和设置属性
Element auther2 = root.addElement("auther")
.addAttribute("name", "Bob")
.addAttribute("location", "US")
.addText("James McWhirter");
return document;
}
讲Document写入到XML文件中
/**
* 讲Document写入到output.xml文件
* @param document
* @throws IOException
*/
public void wirte(Document document) throws IOException {
//写一个没有格式的XML文件
XMLWriter write = new XMLWriter(
new FileWriter("/src/output.xml")
);
write.write(document);
write.close();
// 创建文件输出的时候,自动缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
}
Dom4j对于XML的操作大概就是这个样子,当然这个也是初步的了解Dom4j,当然还有JDom,SAX和java的代码都可以读取XML文件,只不过这个用起来感觉更方便,所以总结了一下。初学者,有问题希望指出来。