Dom4j解析XML_动力节点Java学院整理
dom4j是一个java的xml api,类似于jdom,用来读写xml文件的。dom4j是一个非常非常优秀的java xml api,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在sourceforge上找到它.
对主流的java xml api进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的java软件都在使用dom4j来读写xml,例如hibernate,包括sun公司自己的jaxm也用了dom4j。
使用dom4j开发,需下载dom4j相应的jar文件
1.官网下载:
2.dom4j是sourceforge.net上的一个开源项目,因此可以到http://sourceforge.net/projects/dom4j下载其最新版.
打开dom4j-1.6.1的解压文件,在这里可以看到有docs帮助的文件夹,也有需要使用dom4j解析xml文件的dom4j-1.6.1.jar文件.我们只需要把dom4j-1.6.1.jar文件构建到我们开发的项目中就可以使用dom4j开发了.
下面我以myeclipse创建java项目的构建方法为例说明.
首先创建一个demo项目,在demo项目中创建一个lib文件,把dom4j-1.6.1.jar文件拷贝到lib中,然后右键dom4j-1.6.1jar文件
点击add to build path即可构建到项目中去了.
备注:如果进行的是web项目开发,我们只需要把它拷贝到web-inf/lib中去即可,会自动构建到web项目中.
在项目开发的过程中可以参考docs文件夹的(帮助文档),找到index.html打开,点击quick start可以通过帮助文档进行学习 dom4j进行xml的解析.
下面我对我认为api中重要的方法进行翻译说明如下:
一、dom4j中,获得document对象的方式有三种:
//1.读取xml文件,获得document对象 saxreader reader = new saxreader(); document document = reader.read(new file("csdn.xml")); //2.解析xml形式的文本,得到document对象. string text = "<csdn></csdn>"; document document = documenthelper.parsetext(text); //3.主动创建document对象. document document = documenthelper.createdocument(); //创建根节点 element root = document.addelement("csdn");
二、节点对象操作的方法
//1.获取文档的根节点. element root = document.getrootelement(); //2.取得某个节点的子节点. element element=node.element(“四大名著"); //3.取得节点的文字 string text=node.gettext(); //4.取得某节点下所有名为“csdn”的子节点,并进行遍历. list nodes = rootelm.elements("csdn"); for (iterator it = nodes.iterator(); it.hasnext();) { element elm = (element) it.next(); // do something } //5.对某节点下的所有子节点进行遍历. for(iterator it=root.elementiterator();it.hasnext();){ element element = (element) it.next(); // do something } // 6.在某节点下添加子节点 element elm = newelm.addelement("朝代"); //7.设置节点文字. elm.settext("明朝"); //8.删除某节点. //childelement是待删除的节点,parentelement是其父节点 parentelement.remove(childelment); //9.添加一个cdata节点. element contentelm = infoelm.addelement("content"); contentelm.addcdata(“cdata区域”);
三、节点对象的属性方法操作
//1.取得某节点下的某属性 element root=document.getrootelement(); //属性名name attribute attribute=root.attribute("id"); //2.取得属性的文字 string text=attribute.gettext(); //3.删除某属性 attribute attribute=root.attribute("size"); root.remove(attribute); //4.遍历某节点的所有属性 element root=document.getrootelement(); for(iterator it=root.attributeiterator();it.hasnext();){ attribute attribute = (attribute) it.next(); string text=attribute.gettext(); system.out.println(text); } // 5.设置某节点的属性和文字. newmemberelm.addattribute("name", "sitinspring"); //6.设置属性的文字 attribute attribute=root.attribute("name"); attribute.settext("csdn");
四、将文档写入xml文件
//1.文档中全为英文,不设置编码,直接写入的形式. xmlwriter writer = new xmlwriter(new filewriter("ot.xml")); writer.write(document); writer.close(); // 2.文档中含有中文,设置编码格式写入的形式. outputformat format = outputformat.createprettyprint(); // 创建文件输出的时候,自动缩进的格式 format.setencoding("utf-8");//设置编码 xmlwriter writer = new xmlwriter(newfilewriter("output.xml"),format); writer.write(document); writer.close();
五、字符串与xml的转换
// 1.将字符串转化为xml string text = "<csdn> <java>java班</java></csdn>"; document document = documenthelper.parsetext(text); // 2.将文档或节点的xml转化为字符串. saxreader reader = new saxreader(); document document = reader.read(new file("csdn.xml")); element root=document.getrootelement(); string docxmltext=document.asxml(); string rootxmltext=root.asxml(); element memberelm=root.element("csdn"); string memberxmltext=memberelm.asxml();
六、案例(解析sida.xml文件并对其进行curd的操作)
1.sida.xml描述四大名著的操作,文件内容如下
<?xml version="1.0" encoding="utf-8"?> <四大名著> <西游记 id="x001"> <作者>吴承恩1</作者> <作者>吴承恩2</作者> <朝代>明朝</朝代> </西游记> <红楼梦 id="x002"> <作者>曹雪芹</作者> </红楼梦> </四大名著>
2.解析类测试操作
package dom4j; import java.io.file; import java.io.fileoutputstream; import java.io.filewriter; import java.io.outputstreamwriter; import java.nio.charset.charset; import java.nio.charset.charsetencoder; import java.util.iterator; import java.util.list; import org.dom4j.attribute; import org.dom4j.document; import org.dom4j.element; import org.dom4j.io.outputformat; import org.dom4j.io.saxreader; import org.dom4j.io.xmlwriter; import org.junit.test; public class demo01 { @test public void test() throws exception { // 创建saxreader对象 saxreader reader = new saxreader(); // 通过read方法读取一个文件 转换成document对象 document document = reader.read(new file("src/dom4j/sida.xml")); //获取根节点元素对象 element node = document.getrootelement(); //遍历所有的元素节点 listnodes(node); // 获取四大名著元素节点中,子节点名称为红楼梦元素节点。 element element = node.element("红楼梦"); //获取element的id属性节点对象 attribute attr = element.attribute("id"); //删除属性 element.remove(attr); //添加新的属性 element.addattribute("name", "作者"); // 在红楼梦元素节点中添加朝代元素的节点 element newelement = element.addelement("朝代"); newelement.settext("清朝"); //获取element中的作者元素节点对象 element author = element.element("作者"); //删除元素节点 boolean flag = element.remove(author); //返回true代码删除成功,否则失败 system.out.println(flag); //添加cdata区域 element.addcdata("红楼梦,是一部爱情小说."); // 写入到一个新的文件中 writer(document); } /** * 把document对象写入新的文件 * * @param document * @throws exception */ public void writer(document document) throws exception { // 紧凑的格式 // outputformat format = outputformat.createcompactformat(); // 排版缩进的格式 outputformat format = outputformat.createprettyprint(); // 设置编码 format.setencoding("utf-8"); // 创建xmlwriter对象,指定了写出文件及编码格式 // xmlwriter writer = new xmlwriter(new filewriter(new // file("src//a.xml")),format); xmlwriter writer = new xmlwriter(new outputstreamwriter( new fileoutputstream(new file("src//a.xml")), "utf-8"), format); // 写入 writer.write(document); // 立即写入 writer.flush(); // 关闭操作 writer.close(); } /** * 遍历当前节点元素下面的所有(元素的)子节点 * * @param node */ public void listnodes(element node) { system.out.println("当前节点的名称::" + node.getname()); // 获取当前节点的所有属性节点 list<attribute> list = node.attributes(); // 遍历属性节点 for (attribute attr : list) { system.out.println(attr.gettext() + "-----" + attr.getname() + "---" + attr.getvalue()); } if (!(node.gettexttrim().equals(""))) { system.out.println("文本内容::::" + node.gettext()); } // 当前节点下面子节点迭代器 iterator<element> it = node.elementiterator(); // 遍历 while (it.hasnext()) { // 获取某个子节点对象 element e = it.next(); // 对子节点进行遍历 listnodes(e); } } /** * 介绍element中的element方法和elements方法的使用 * * @param node */ public void elementmethod(element node) { // 获取node节点中,子节点的元素名称为西游记的元素节点。 element e = node.element("西游记"); // 获取西游记元素节点中,子节点为作者的元素节点(可以看到只能获取第一个作者元素节点) element author = e.element("作者"); system.out.println(e.getname() + "----" + author.gettext()); // 获取西游记这个元素节点 中,所有子节点名称为作者元素的节点 。 list<element> authors = e.elements("作者"); for (element aut : authors) { system.out.println(aut.gettext()); } // 获取西游记这个元素节点 所有元素的子节点。 list<element> elements = e.elements(); for (element el : elements) { system.out.println(el.gettext()); } } }
自己适当注释部分代码观察运行效果,反复练习,希望你对dom4j有进一步的了解.
七、字符串与xml互转换案例
package dom4j; import java.io.file; import java.io.fileoutputstream; import java.io.outputstreamwriter; import org.dom4j.document; import org.dom4j.documenthelper; import org.dom4j.element; import org.dom4j.io.outputformat; import org.dom4j.io.saxreader; import org.dom4j.io.xmlwriter; import org.junit.test; public class demo02 { @test public void test() throws exception { // 创建saxreader对象 saxreader reader = new saxreader(); // 读取一个文件,把这个文件转换成document对象 document document = reader.read(new file("src//c.xml")); // 获取根元素 element root = document.getrootelement(); // 把文档转换字符串 string docxmltext = document.asxml(); system.out.println(docxmltext); system.out.println("---------------------------"); // csdn元素标签根转换的内容 string rootxmltext = root.asxml(); system.out.println(rootxmltext); system.out.println("---------------------------"); // 获取java元素标签 内的内容 element e = root.element("java"); system.out.println(e.asxml()); } /** * 创建一个document对象 往document对象中添加节点元素 转存为xml文件 * * @throws exception */ public void test2() throws exception { document document = documenthelper.createdocument();// 创建根节点 element root = document.addelement("csdn"); element java = root.addelement("java"); java.settext("java班"); element ios = root.addelement("ios"); ios.settext("ios班"); writer(document); } /** * 把一个文本字符串转换document对象 * * @throws exception */ public void test1() throws exception { string text = "<csdn><java>java班</java><net>net班</net></csdn>"; document document = documenthelper.parsetext(text); element e = document.getrootelement(); system.out.println(e.getname()); writer(document); } /** * 把document对象写入新的文件 * * @param document * @throws exception */ public void writer(document document) throws exception { // 紧凑的格式 // outputformat format = outputformat.createcompactformat(); // 排版缩进的格式 outputformat format = outputformat.createprettyprint(); // 设置编码 format.setencoding("utf-8"); // 创建xmlwriter对象,指定了写出文件及编码格式 // xmlwriter writer = new xmlwriter(new filewriter(new // file("src//a.xml")),format); xmlwriter writer = new xmlwriter(new outputstreamwriter( new fileoutputstream(new file("src//c.xml")), "utf-8"), format); // 写入 writer.write(document); // 立即写入 writer.flush(); // 关闭操作 writer.close(); } }