Dom4J对XML文件的读取和写入

时间:2022-04-04 12:05:52

       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的时候,我们免不了就是大堆小堆的配置文件,那么如何读取配置文件呢。

      使用前准备的jar包

     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下的类文件就可以使用了。

     Dom4j的学习

     读取XML文件

    读取得先有一个XML文件不是,所以先给大家XML文件

   

<?xml version="1.0" encoding="UTF-8"?>
<ROWDATA>

<ROW>
<C0>1</C0>
<foo>7891</foo>
<ENAME>sdffff</ENAME>
<JOB>job</JOB>
<MGR></MGR>
<HIREDATE>2010-1-1</HIREDATE>
<SAL>5000.00</SAL>
<COMM>1000.00</COMM>
<DEPTNO></DEPTNO>
</ROW>

<foo>
<C0>2</C0>
<foo>7369</foo>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>1980-12-17</HIREDATE>
<SAL>800.00</SAL>
<COMM></COMM>
<DEPTNO>20</DEPTNO>
</foo>
<a href="www.baidu.com">百度</a>
<a href="http://my.csdn.net/lovemenghaibin'">孟海滨博客</a>
</ROWDATA>


 

     首先要读取一个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中都有链接<a href ='http://my.csdn.net/lovemenghaibin'>孟海滨博客</a>,那我如何获得链接呢。代码如下

/**
* 读取文档中的链接
* @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());
}
}

        创建XML文件

        创建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文件,只不过这个用起来感觉更方便,所以总结了一下。初学者,有问题希望指出来。