dom4j中文教程 第一集 史上最全最实用的dom4j教程

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文档,之后的操作均以此文档为基础。
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <u9vip>
  3.         <class id="1" title="Dom4j实战教程">
  4.                 <author id="1">U9VIP</author>
  5.                 <description>最实用的原创教程分享论坛</description>
  6.                 <demo>www.u9vip.com 登录即可下载最新最全的教程资源</demo>
  7.         </class>
  8.         <class id="2" title="Dom4j视频教程">
  9.                 <author id="1">U9VIP Admin</author>
  10.                 <description>最实用的入门视教程</description>
  11.                 <demo>www.u9vip.com 登录即可下载最新最全的教程资源</demo>
  12.         </class>
  13. </u9vip>
复制代码



3. 建立一个XML文档   First_HowToCreate_XML

  1. package com.u9vip.dom4j;

  2. import java.io.File;
  3. import java.io.FileWriter;

  4. import org.dom4j.Document;
  5. import org.dom4j.DocumentException;
  6. import org.dom4j.DocumentHelper;
  7. import org.dom4j.Element;
  8. import org.dom4j.io.SAXReader;
  9. import org.dom4j.io.XMLWriter;
  10. import org.junit.Test;

  11. /**

  12. * @author Administrator www.u9vip.com 获取Document的三种方式
  13. */
  14. public class First_HowToCreate {

  15.         @Test
  16.         /**
  17.          *  创建一个对象
  18.          */
  19.         public void firstCreate() throws DocumentException {
  20.                 SAXReader reader = new SAXReader();
  21.                 Document document = reader.read("data.xml");
  22.         }

  23.         @Test
  24.         /**
  25.          *  文本片段
  26.          */
  27.         public void secondCreate() throws DocumentException {
  28.                 String part = "<u9vip><name>U9VIP</name><title>最实用的原创教程分享论坛</title></u9vip>";
  29.                 Document document = DocumentHelper.parseText(part);// Ctrl+2 +L 自动补全
  30.         }

  31.         @Test
  32.         /**
  33.          *  方法创建
  34.          */
  35.         public void thirdCreate() throws DocumentException {
  36.                 createXMLFile("u9vipDemo1.xml");
  37.         }

  38. /**
  39.          * 建立一个XML文档,文档名由输入属性决定
  40.          * 
  41.          * @param filename
  42.          *            需建立的文件名
  43.          * @return 返回操作结果, 0表失败, 1表成功
  44.          */
  45.         public int createXMLFile(String filename) {
  46.                 /** 返回操作结果, 0表失败, 1表成功 */
  47.                 int returnValue = 0;
  48.                 /** 建立document对象 */
  49.                 Document document = DocumentHelper.createDocument();
  50.                 /** 建立XML文档的根u9vip */
  51.                 Element u9vipElement = document.addElement("u9vip");
  52.                 /** 加入一行注释 */
  53.                 u9vipElement
  54.                                 .addComment("This is a test for dom4j, Winnie Bear , 2014.1.14");
  55.                 /** 加入第一个class节点 */
  56.                 Element classElement = u9vipElement.addElement("class");
  57.                 /** 加入id属性内容 */
  58.                 classElement.addAttribute("id", "1");
  59.                 /** 加入title节点 */
  60.                 Element titleElement = classElement.addElement("title");
  61.                 /** 为title设置内容 */
  62.                 titleElement.setText("Dom4j Tutorials");

  63.                 /** 类似的再添加一个class */
  64.                 classElement = classElement.addElement("class");
  65.                 classElement.addAttribute("id", "2");
  66.                 titleElement = classElement.addElement("title");
  67.                 titleElement.setText("Dom4j Studing");

  68.                 /** 加入author节点 */
  69.                 Element authorElement = classElement.addElement("author");
  70.                 authorElement.setText("U9VIP");
  71.                 classElement.addElement("description").setText("最实用的原创教程分享论坛");
  72.                 try {
  73.                         /** 将document中的内容写入文件中 */
  74.                         XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
  75.                         writer.write(document);
  76.                         writer.close();
  77.                         /** 执行成功,需返回1 */
  78.                         returnValue = 1;
  79.                 } catch (Exception ex) {
  80.                         ex.printStackTrace();
  81.                 }

  82.                 return returnValue;
  83.         }        

  84. }
复制代码


说明:
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文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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,则删除该节点


  1. @Test
  2.         public void demo2()
  3.         {
  4.                 ModiXMLFile("u9vipDemo1.xml","u9vipDemo2.xml");
  5.                 
  6.         }
  7.         
  8.          /**
  9.      * 修改XML文件中内容,并另存为一个新文件
  10.      * 重点掌握dom4j中如何添加节点,修改节点,删除节点
  11.      * @param filename 修改对象文件
  12.      * @param newfilename 修改后另存为该文件
  13.      * @return 返回操作结果, 0表失败, 1表成功
  14.      */
  15.     public int ModiXMLFile(String filename,String newfilename){
  16.        int returnValue = 0;
  17.        try{
  18.            SAXReader saxReader = new SAXReader();
  19.            Document document = saxReader.read(new File(filename));
  20.            /**
  21.             * 如果u9vip 节点中id属性的内容为1,则修改成id+1
  22.             * 先用xpath查找对象
  23.             * 
  24.             * */
  25.          
  26.            List list = document.selectNodes("/u9vip/class/@id" );
  27.            Iterator iter = list.iterator();
  28.            while(iter.hasNext()){
  29.               Attribute attribute = (Attribute)iter.next();
  30.               if(attribute.getValue().equals("1")){
  31.               int i=Integer.parseInt(attribute.getValue())+1;
  32.               attribute.setValue(""+i);
  33.               }  
  34.            }
  35.           
  36.            /**
  37.             * 把author项内容改为admin,
  38.             * 并添加demo节点,demo节点的内容为www.u9vip.com ,还为demo节点添加一个属性date 2014-01-14
  39.             */
  40.            list = document.selectNodes("/u9vip/author" );
  41.            iter = list.iterator();
  42.            if(iter.hasNext()){
  43.               Element authorElement = (Element)iter.next();
  44.               authorElement.setText("admin");
  45.               Element demoElement = authorElement.addElement("demo");
  46.               demoElement.setText("www.u9vip.com");
  47.               demoElement.addAttribute("date","2014-01-14");
  48.            }
  49.           
  50.            /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
  51.            list = document.selectNodes("/u9vip/class");
  52.            iter = list.iterator();
  53.            while(iter.hasNext()){
  54.               Element bookElement = (Element)iter.next();
  55.               Iterator iterator = bookElement.elementIterator("title");
  56.               while(iterator.hasNext()){
  57.                   Element titleElement=(Element)iterator.next();
  58.                   if(titleElement.getText().equals("Dom4j Tutorials")){
  59.                      bookElement.remove(titleElement);
  60.                   }
  61.               }
  62.            }         
  63.           
  64.            try{
  65.               /** 将document中的内容写入文件中 */
  66.               XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
  67.               writer.write(document);
  68.               writer.close();
  69.               /** 执行成功,需返回1 */
  70.               returnValue = 1;
  71.            }catch(Exception ex){
  72.               ex.printStackTrace();
  73.            }
  74.           
  75.        }catch(Exception ex){
  76.            ex.printStackTrace();
  77.        }
  78.        return returnValue;
  79.     }
复制代码



说明:
List list = document.selectNodes("/u9vip/class/@id" );
list = document.selectNodes("/u9vip/author");
上述代码通过xpath查找到相应内容。

通过setValue()、setText()修改节点内容。

通过remove()删除节点或属性。

5. 格式化输出和指定编码

默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。

  1. @Test
  2.         public void demo3()
  3.         {
  4.             formatXMLFile("u9vipDemo1.xml");
  5.                 
  6.         }
  7.     
  8.     /**
  9.      * 格式化XML文档,并解决中文问题
  10.      * @param filename
  11.      * @return
  12.      */
  13.     public int formatXMLFile(String filename){
  14.        int returnValue = 0;
  15.        try{
  16.            SAXReader saxReader = new SAXReader();
  17.            Document document = saxReader.read(new File(filename));
  18.            XMLWriter writer = null;
  19.            /** 格式化输出,类型IE浏览一样 */
  20.            OutputFormat format = OutputFormat.createPrettyPrint();
  21.            /** 指定XML编码 */
  22.            format.setEncoding("GBK");//  如果改为UTF-8为怎么样format.setEncoding("UTF-8");
  23.            writer= new XMLWriter(new FileWriter(new File(filename)),format);
  24.            writer.write(document);
  25.            writer.close();     
  26.            /** 执行成功,需返回1 */
  27.            returnValue = 1;    
  28.        }catch(Exception ex){
  29.            ex.printStackTrace();
  30.        }
  31.        return returnValue;
  32.     }
复制代码


说明:

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的编码和声明编码类型不一致,解析时按照声明编码进行解析,就发生了错误.解决此问题的最简单方法就是采用字节流,而不采用字符流。

  1. try {
  2.                         /** 格式化输出,类型IE浏览一样 */
  3.                    OutputFormat format = OutputFormat.createPrettyPrint();
  4.                    /** 指定XML编码 */
  5.                    format.setEncoding("utf-8");
  6.                         /** 将document中的内容写入文件中 */
  7.                         XMLWriter writer = new XMLWriter(new FileOutputStream(new File(filename)),format);
  8.                 
  9.                         
  10.                         writer.write(document);
  11.                         writer.close();
  12.                         
  13.                         /** 执行成功,需返回1 */
  14.                         returnValue = 1;
  15.                 } catch (Exception ex) {
  16.                         ex.printStackTrace();
  17.                 }
复制代码





6. 完整的类代码
前面提出的方法都是零散的,下面给出完整类代码。
  1. package com.u9vip.dom4j;

  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.FileWriter;
  5. import java.util.Iterator;
  6. import java.util.List;

  7. import org.dom4j.Attribute;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentException;
  10. import org.dom4j.DocumentHelper;
  11. import org.dom4j.Element;
  12. import org.dom4j.io.OutputFormat;
  13. import org.dom4j.io.SAXReader;
  14. import org.dom4j.io.XMLWriter;
  15. import org.junit.Test;

  16. /**

  17. * @author Administrator www.u9vip.com 获取Document的三种方式
  18. */
  19. public class First_HowToCreate {

  20.         @Test
  21.         /**
  22.          *  创建一个对象
  23.          */
  24.         public void firstCreate() throws DocumentException {
  25.                 SAXReader reader = new SAXReader();
  26.                 Document document = reader.read("data.xml");
  27.         }

  28.         @Test
  29.         /**
  30.          *  文本片段
  31.          */
  32.         public void secondCreate() throws DocumentException {
  33.                 String part = "<u9vip><name>U9VIP</name><title>最实用的原创教程分享论坛</title></u9vip>";
  34.                 Document document = DocumentHelper.parseText(part);// Ctrl+2 +L 自动补全
  35.         }

  36.         @Test
  37.         /**
  38.          *  方法创建
  39.          */
  40.         public void thirdCreate() throws DocumentException {
  41.                 createXMLFile("u9vipDemo1.xml");
  42.         }

  43.         /**
  44.          * 建立一个XML文档,文档名由输入属性决定
  45.          * 
  46.          * @param filename
  47.          *            需建立的文件名
  48.          * @return 返回操作结果, 0表失败, 1表成功
  49.          */
  50.         public int createXMLFile(String filename) {
  51.                 /** 返回操作结果, 0表失败, 1表成功 */
  52.                 int returnValue = 0;
  53.                 /** 建立document对象 */
  54.                 Document document = DocumentHelper.createDocument();
  55.                 /** 建立XML文档的根u9vip */
  56.                 Element u9vipElement = document.addElement("u9vip");
  57.                 /** 加入一行注释 */
  58.                 u9vipElement
  59.                                 .addComment("This is a test for dom4j, Winnie Bear , 2014.1.14");
  60.                 /** 加入第一个class节点 */
  61.                 Element classElement = u9vipElement.addElement("class");
  62.                 /** 加入id属性内容 */
  63.                 classElement.addAttribute("id", "1");
  64.                 /** 加入title节点 */
  65.                 Element titleElement = classElement.addElement("title");
  66.                 /** 为title设置内容 */
  67.                 titleElement.setText("Dom4j Tutorials");

  68.                 /** 类似的再添加一个class */
  69.                 classElement = classElement.addElement("class");
  70.                 classElement.addAttribute("id", "2");
  71.                 titleElement = classElement.addElement("title");
  72.                 titleElement.setText("Dom4j Studing");

  73.                 /** 加入author节点 */
  74.                 Element authorElement = classElement.addElement("author");
  75.                 authorElement.setText("U9VIP");
  76.                 classElement.addElement("description").setText("最实用的原创教程分享论坛");
  77.                 
  78.                 try {
  79.                         /** 格式化输出,类型IE浏览一样 */
  80.                    OutputFormat format = OutputFormat.createPrettyPrint();
  81.                    /** 指定XML编码 */
  82.                    format.setEncoding("utf-8");
  83.                         /** 将document中的内容写入文件中 */
  84.                         XMLWriter writer = new XMLWriter(new FileOutputStream(new File(filename)),format);
  85.                 
  86.                         
  87.                         writer.write(document);
  88.                         writer.close();
  89.                         
  90.                         /** 执行成功,需返回1 */
  91.                         returnValue = 1;
  92.                 } catch (Exception ex) {
  93.                         ex.printStackTrace();
  94.                 }

  95.                 return returnValue;
  96.         }
  97.         
  98.         @Test
  99.         public void demo2()
  100.         {
  101.                 ModiXMLFile("u9vipDemo1.xml","u9vipDemo2.xml");
  102.                 
  103.         }
  104.         
  105.          /**
  106.      * 修改XML文件中内容,并另存为一个新文件
  107.      * 重点掌握dom4j中如何添加节点,修改节点,删除节点
  108.      * @param filename 修改对象文件
  109.      * @param newfilename 修改后另存为该文件
  110.      * @return 返回操作结果, 0表失败, 1表成功
  111.      */
  112.     public int ModiXMLFile(String filename,String newfilename){
  113.        int returnValue = 0;
  114.        try{
  115.            SAXReader saxReader = new SAXReader();
  116.            Document document = saxReader.read(new File(filename));
  117.            /**
  118.             * 如果u9vip 节点中id属性的内容为1,则修改成id+1
  119.             * 先用xpath查找对象
  120.             * 
  121.             * */
  122.          
  123.            List list = document.selectNodes("/u9vip/class/@id" );
  124.            Iterator iter = list.iterator();
  125.            while(iter.hasNext()){
  126.               Attribute attribute = (Attribute)iter.next();
  127.               if(attribute.getValue().equals("1")){
  128.               int i=Integer.parseInt(attribute.getValue())+1;
  129.               attribute.setValue(""+i);
  130.               }  
  131.            }
  132.           
  133.            /**
  134.             * 把author项内容改为admin,
  135.             * 并添加demo节点,demo节点的内容为www.u9vip.com ,还为demo节点添加一个属性date 2014-01-14
  136.             */
  137.            list = document.selectNodes("/u9vip/author" );
  138.            iter = list.iterator();
  139.            if(iter.hasNext()){
  140.               Element authorElement = (Element)iter.next();
  141.               authorElement.setText("admin");
  142.               Element demoElement = authorElement.addElement("demo");
  143.               demoElement.setText("www.u9vip.com");
  144.               demoElement.addAttribute("date","2014-01-14");
  145.            }
  146.           
  147.            /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
  148.            list = document.selectNodes("/u9vip/class");
  149.            iter = list.iterator();
  150.            while(iter.hasNext()){
  151.               Element bookElement = (Element)iter.next();
  152.               Iterator iterator = bookElement.elementIterator("title");
  153.               while(iterator.hasNext()){
  154.                   Element titleElement=(Element)iterator.next();
  155.                   if(titleElement.getText().equals("Dom4j Tutorials")){
  156.                      bookElement.remove(titleElement);
  157.                   }
  158.               }
  159.            }         
  160.           
  161.            try{
  162.               /** 将document中的内容写入文件中 */
  163.               XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
  164.               writer.write(document);
  165.               writer.close();
  166.               /** 执行成功,需返回1 */
  167.               returnValue = 1;
  168.            }catch(Exception ex){
  169.               ex.printStackTrace();
  170.            }
  171.           
  172.        }catch(Exception ex){
  173.            ex.printStackTrace();
  174.        }
  175.        return returnValue;
  176.     }
  177.     
  178.     
  179.     @Test
  180.         public void demo3()
  181.         {
  182.             formatXMLFile("u9vipDemo1.xml");
  183.                 
  184.         }
  185.     
  186.     /**
  187.      * 格式化XML文档,并解决中文问题
  188.      * @param filename
  189.      * @return
  190.      */
  191.     public int formatXMLFile(String filename){
  192.        int returnValue = 0;
  193.        try{
  194.            SAXReader saxReader = new SAXReader();
  195.            Document document = saxReader.read(new File(filename));
  196.            XMLWriter writer = null;
  197.            /** 格式化输出,类型IE浏览一样 */
  198.            OutputFormat format = OutputFormat.createPrettyPrint();
  199.            /** 指定XML编码 */
  200.            format.setEncoding("GBK");//  format.setEncoding("GBK");
  201.            writer= new XMLWriter(new FileWriter(new File(filename)),format);
  202.            writer.write(document);
  203.            writer.close();     
  204.            /** 执行成功,需返回1 */
  205.            returnValue = 1;    
  206.        }catch(Exception ex){
  207.            ex.printStackTrace();
  208.        }
  209.        return returnValue;
  210.     }
  211.     
  212. }
复制代码

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值