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