dom4j中文教程 第一集 史上最全最实用的dom4j教程 http://www.u9vip.com/forum.php?mod=viewthread&tid=276&fromuid=1 (出处: U9社区) 注:该文章内所有代码为本人亲自编写,所有代码均已调通,请放心学习。 该教程总计两集 (出处: U9社区 http://www.u9vip.com/) 第一集 http://www.u9vip.com/forum.php?mod=viewthread&tid=276&fromuid=1 第二集 相关知识: dom4j解析xml dom4j api dom4j-1.6.1.jar dom4j.jar java dom4j dom4j-1.6.1.jar org.dom4j dom4j maven DOM4J官方网站:(中国,你懂的。。。时常访问不了) http://www.dom4j.org/ DOM4J下载(SourceForge),最新版本 dom4j-1.6.1 http://sourceforge.net/projects/dom4j 本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。 1. 下载与安装 dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.6.1 。 dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。 可以到http://sourceforge.net/projects/dom4j下载其最新版。 dom4j-1.6.1.zip (5.12 MB, 下载次数: 0) dom4j-1.6.1.z01 (6 MB, 下载次数: 0) dom4j-1.6.1.rar的完整版大约10M,是一个名为dom4j-1.6.1.rar的压缩包,解压后有一个dom4j-1.6.1.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-6.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。 2. 示例XML文档(u9vip.xml) 为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <u9vip>
- <class id="1" title="Dom4j实战教程">
- <author id="1">U9VIP</author>
- <description>最实用的原创教程分享论坛</description>
- <demo>www.u9vip.com 登录即可下载最新最全的教程资源</demo>
- </class>
- <class id="2" title="Dom4j视频教程">
- <author id="1">U9VIP Admin</author>
- <description>最实用的入门视教程</description>
- <demo>www.u9vip.com 登录即可下载最新最全的教程资源</demo>
- </class>
- </u9vip>
复制代码
3. 建立一个XML文档 First_HowToCreate_XML
- package com.u9vip.dom4j;
-
- import java.io.File;
- import java.io.FileWriter;
-
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- import org.junit.Test;
-
- /**
- *
- * @author Administrator www.u9vip.com 获取Document的三种方式
- */
- public class First_HowToCreate {
-
- @Test
- /**
- * 创建一个对象
- */
- public void firstCreate() throws DocumentException {
- SAXReader reader = new SAXReader();
- Document document = reader.read("data.xml");
- }
-
- @Test
- /**
- * 文本片段
- */
- public void secondCreate() throws DocumentException {
- String part = "<u9vip><name>U9VIP</name><title>最实用的原创教程分享论坛</title></u9vip>";
- Document document = DocumentHelper.parseText(part);// Ctrl+2 +L 自动补全
- }
-
- @Test
- /**
- * 方法创建
- */
- public void thirdCreate() throws DocumentException {
- createXMLFile("u9vipDemo1.xml");
- }
-
- /**
- * 建立一个XML文档,文档名由输入属性决定
- *
- * @param filename
- * 需建立的文件名
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int createXMLFile(String filename) {
- /** 返回操作结果, 0表失败, 1表成功 */
- int returnValue = 0;
- /** 建立document对象 */
- Document document = DocumentHelper.createDocument();
- /** 建立XML文档的根u9vip */
- Element u9vipElement = document.addElement("u9vip");
- /** 加入一行注释 */
- u9vipElement
- .addComment("This is a test for dom4j, Winnie Bear , 2014.1.14");
- /** 加入第一个class节点 */
- Element classElement = u9vipElement.addElement("class");
- /** 加入id属性内容 */
- classElement.addAttribute("id", "1");
- /** 加入title节点 */
- Element titleElement = classElement.addElement("title");
- /** 为title设置内容 */
- titleElement.setText("Dom4j Tutorials");
-
- /** 类似的再添加一个class */
- classElement = classElement.addElement("class");
- classElement.addAttribute("id", "2");
- titleElement = classElement.addElement("title");
- titleElement.setText("Dom4j Studing");
-
- /** 加入author节点 */
- Element authorElement = classElement.addElement("author");
- authorElement.setText("U9VIP");
- classElement.addElement("description").setText("最实用的原创教程分享论坛");
- try {
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- } catch (Exception ex) {
- ex.printStackTrace();
- }
-
- return returnValue;
- }
-
- }
-
复制代码
说明: Document document = DocumentHelper.createDocument(); 通过这句定义一个XML文档对象。 Element booksElement = document.addElement("u9vip"); 通过这句定义一个XML元素,这里添加的是根节点。 Element有几个重要的方法: l addComment:添加注释 l addAttribute:添加属性 l addElement:添加子元素 最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。 生成后的u9vipDemo1.xml文件内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <u9vip><!--This is a test for dom4j, Winnie Bear , 2014.1.14--><class id="1"><title>Dom4j Tutorials</title></class><class id="2"><title>Dom4j Studing</title></class><author>U9VIP</author><description>��ʵ�õ�ԭ���̷̳�����̳</description></u9vip>
复制代码
此时我们发现一个乱码问题,一个未格式化问题 4. 修改XML文档 有三项修改任务,依次为: l 如果u9vip 节点中id属性的内容为1,则修改成id+1 l 把author项内容改为admin,并添加demo节点 l 若title内容为Dom4j Tutorials,则删除该节点
- @Test
- public void demo2()
- {
- ModiXMLFile("u9vipDemo1.xml","u9vipDemo2.xml");
-
- }
-
- /**
- * 修改XML文件中内容,并另存为一个新文件
- * 重点掌握dom4j中如何添加节点,修改节点,删除节点
- * @param filename 修改对象文件
- * @param newfilename 修改后另存为该文件
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int ModiXMLFile(String filename,String newfilename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- /**
- * 如果u9vip 节点中id属性的内容为1,则修改成id+1
- * 先用xpath查找对象
- *
- * */
-
- List list = document.selectNodes("/u9vip/class/@id" );
- Iterator iter = list.iterator();
- while(iter.hasNext()){
- Attribute attribute = (Attribute)iter.next();
- if(attribute.getValue().equals("1")){
- int i=Integer.parseInt(attribute.getValue())+1;
- attribute.setValue(""+i);
- }
- }
-
- /**
- * 把author项内容改为admin,
- * 并添加demo节点,demo节点的内容为www.u9vip.com ,还为demo节点添加一个属性date 2014-01-14
- */
- list = document.selectNodes("/u9vip/author" );
- iter = list.iterator();
- if(iter.hasNext()){
- Element authorElement = (Element)iter.next();
- authorElement.setText("admin");
- Element demoElement = authorElement.addElement("demo");
- demoElement.setText("www.u9vip.com");
- demoElement.addAttribute("date","2014-01-14");
- }
-
- /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
- list = document.selectNodes("/u9vip/class");
- iter = list.iterator();
- while(iter.hasNext()){
- Element bookElement = (Element)iter.next();
- Iterator iterator = bookElement.elementIterator("title");
- while(iterator.hasNext()){
- Element titleElement=(Element)iterator.next();
- if(titleElement.getText().equals("Dom4j Tutorials")){
- bookElement.remove(titleElement);
- }
- }
- }
-
- try{
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
复制代码
说明: List list = document.selectNodes("/u9vip/class/@id" ); list = document.selectNodes("/u9vip/author"); 上述代码通过xpath查找到相应内容。 通过setValue()、setText()修改节点内容。 通过remove()删除节点或属性。 5. 格式化输出和指定编码 默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。
- @Test
- public void demo3()
- {
- formatXMLFile("u9vipDemo1.xml");
-
- }
-
- /**
- * 格式化XML文档,并解决中文问题
- * @param filename
- * @return
- */
- public int formatXMLFile(String filename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- XMLWriter writer = null;
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("GBK");// 如果改为UTF-8为怎么样format.setEncoding("UTF-8");
- writer= new XMLWriter(new FileWriter(new File(filename)),format);
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
复制代码
说明: OutputFormat format = OutputFormat.createPrettyPrint(); 这句指定了格式化的方式为缩进式,则非紧凑式。 format.setEncoding("GBK"); 指定编码为GBK。 XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format); 这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。 dom4j UTF-8 编码问题 /** 指定XML编码 */ format.setEncoding("GBK");// 如果改为UTF-8为怎么样format.setEncoding("UTF-8"); 生成的xml出现乱码问题? 如上代码生成的含中文的xml文件,在进行解析时会发生编码错误,原因是Writer对象不提供编码处理的功能,format.setEncoding("UTF-8")设置了使用UTF-8编码存储xml文件,但是在使用Writer对象时,不提供编码处理功能,生成xml文件时使用了默认的系统编码,在中文版系统中和JDK中,而默认的系统编码一般为GBK,GB2312等中文字符编码,所以生成的xml的编码和声明编码类型不一致,解析时按照声明编码进行解析,就发生了错误.解决此问题的最简单方法就是采用字节流,而不采用字符流。
- try {
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("utf-8");
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileOutputStream(new File(filename)),format);
-
-
- writer.write(document);
- writer.close();
-
- /** 执行成功,需返回1 */
- returnValue = 1;
- } catch (Exception ex) {
- ex.printStackTrace();
- }
复制代码
6. 完整的类代码 前面提出的方法都是零散的,下面给出完整类代码。
- package com.u9vip.dom4j;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.FileWriter;
- import java.util.Iterator;
- import java.util.List;
-
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- 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;
-
- /**
- *
- * @author Administrator www.u9vip.com 获取Document的三种方式
- */
- public class First_HowToCreate {
-
- @Test
- /**
- * 创建一个对象
- */
- public void firstCreate() throws DocumentException {
- SAXReader reader = new SAXReader();
- Document document = reader.read("data.xml");
- }
-
- @Test
- /**
- * 文本片段
- */
- public void secondCreate() throws DocumentException {
- String part = "<u9vip><name>U9VIP</name><title>最实用的原创教程分享论坛</title></u9vip>";
- Document document = DocumentHelper.parseText(part);// Ctrl+2 +L 自动补全
- }
-
- @Test
- /**
- * 方法创建
- */
- public void thirdCreate() throws DocumentException {
- createXMLFile("u9vipDemo1.xml");
- }
-
- /**
- * 建立一个XML文档,文档名由输入属性决定
- *
- * @param filename
- * 需建立的文件名
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int createXMLFile(String filename) {
- /** 返回操作结果, 0表失败, 1表成功 */
- int returnValue = 0;
- /** 建立document对象 */
- Document document = DocumentHelper.createDocument();
- /** 建立XML文档的根u9vip */
- Element u9vipElement = document.addElement("u9vip");
- /** 加入一行注释 */
- u9vipElement
- .addComment("This is a test for dom4j, Winnie Bear , 2014.1.14");
- /** 加入第一个class节点 */
- Element classElement = u9vipElement.addElement("class");
- /** 加入id属性内容 */
- classElement.addAttribute("id", "1");
- /** 加入title节点 */
- Element titleElement = classElement.addElement("title");
- /** 为title设置内容 */
- titleElement.setText("Dom4j Tutorials");
-
- /** 类似的再添加一个class */
- classElement = classElement.addElement("class");
- classElement.addAttribute("id", "2");
- titleElement = classElement.addElement("title");
- titleElement.setText("Dom4j Studing");
-
- /** 加入author节点 */
- Element authorElement = classElement.addElement("author");
- authorElement.setText("U9VIP");
- classElement.addElement("description").setText("最实用的原创教程分享论坛");
-
- try {
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("utf-8");
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileOutputStream(new File(filename)),format);
-
-
- writer.write(document);
- writer.close();
-
- /** 执行成功,需返回1 */
- returnValue = 1;
- } catch (Exception ex) {
- ex.printStackTrace();
- }
-
- return returnValue;
- }
-
- @Test
- public void demo2()
- {
- ModiXMLFile("u9vipDemo1.xml","u9vipDemo2.xml");
-
- }
-
- /**
- * 修改XML文件中内容,并另存为一个新文件
- * 重点掌握dom4j中如何添加节点,修改节点,删除节点
- * @param filename 修改对象文件
- * @param newfilename 修改后另存为该文件
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int ModiXMLFile(String filename,String newfilename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- /**
- * 如果u9vip 节点中id属性的内容为1,则修改成id+1
- * 先用xpath查找对象
- *
- * */
-
- List list = document.selectNodes("/u9vip/class/@id" );
- Iterator iter = list.iterator();
- while(iter.hasNext()){
- Attribute attribute = (Attribute)iter.next();
- if(attribute.getValue().equals("1")){
- int i=Integer.parseInt(attribute.getValue())+1;
- attribute.setValue(""+i);
- }
- }
-
- /**
- * 把author项内容改为admin,
- * 并添加demo节点,demo节点的内容为www.u9vip.com ,还为demo节点添加一个属性date 2014-01-14
- */
- list = document.selectNodes("/u9vip/author" );
- iter = list.iterator();
- if(iter.hasNext()){
- Element authorElement = (Element)iter.next();
- authorElement.setText("admin");
- Element demoElement = authorElement.addElement("demo");
- demoElement.setText("www.u9vip.com");
- demoElement.addAttribute("date","2014-01-14");
- }
-
- /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
- list = document.selectNodes("/u9vip/class");
- iter = list.iterator();
- while(iter.hasNext()){
- Element bookElement = (Element)iter.next();
- Iterator iterator = bookElement.elementIterator("title");
- while(iterator.hasNext()){
- Element titleElement=(Element)iterator.next();
- if(titleElement.getText().equals("Dom4j Tutorials")){
- bookElement.remove(titleElement);
- }
- }
- }
-
- try{
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
-
-
- @Test
- public void demo3()
- {
- formatXMLFile("u9vipDemo1.xml");
-
- }
-
- /**
- * 格式化XML文档,并解决中文问题
- * @param filename
- * @return
- */
- public int formatXMLFile(String filename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- XMLWriter writer = null;
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("GBK");// format.setEncoding("GBK");
- writer= new XMLWriter(new FileWriter(new File(filename)),format);
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
-
- }
-
复制代码
|