zoukankan      html  css  js  c++  java
  • 【收藏用】--切勿转载JAVA 使用Dom4j 解析XML

    原帖地址 : http://blog.csdn.NET/yyywyr/article/details/38359049

    解析XML的方式有很多,本文介绍使用dom4j解析xml。

    1、环境准备

    (1)下载dom4j-1.6.1.jar

    (2)下载junit-4.10.jar

    2、温馨提示

    解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

    (1)自己创建Document对象

     
    1. Document document = DocumentHelper.createDocument();  
    2. Element root = document.addElement("students");  

    其中students是根节点,可以继续添加其他节点等操作。

    (2)读取XML文件获取Document对象

     
    1. //创建SAXReader对象  
    2.         SAXReader reader = new SAXReader();  
    3.         //读取文件 转换成Document  
    4.         Document document = reader.read(new File("XXXX.xml"));  

    (3)读取XML文本内容获取Document对象

     
    1. String xmlStr = "<students>......</students>";  
    2.         Document document = DocumentHelper.parseText(xmlStr);  

    3、示例

    (1)xml文件内容如下

     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <students>  
    3.     <student1 id="001">  
    4.         <微信公众号>@残缺的孤独</微信公众号>  
    5.         <学号>20140101</学号>  
    6.         <地址>北京海淀区</地址>  
    7.         <座右铭>要么强大,要么听话</座右铭>  
    8.     </student1>  
    9.     <student2 id="002">  
    10.         <新浪微博>@残缺的孤独</新浪微博>  
    11.         <学号>20140102</学号>  
    12.         <地址>北京朝阳区</地址>  
    13.         <座右铭>在哭泣中学会坚强</座右铭>  
    14.     </student2>  
    15. </students>  

    (2)解析过程

     
    1. package cn.com.yy.dom4j;  
    2.   
    3. import java.io.File;  
    4. import java.util.Iterator;  
    5. import java.util.List;  
    6.   
    7. import org.dom4j.Attribute;  
    8. import org.dom4j.Document;  
    9. import org.dom4j.Element;  
    10. import org.dom4j.io.SAXReader;  
    11. import org.junit.Test;  
    12.   
    13. public class Dom4JforXML {  
    14.       
    15.     @Test  
    16.     public void test() throws Exception{  
    17.         //创建SAXReader对象  
    18.         SAXReader reader = new SAXReader();  
    19.         //读取文件 转换成Document  
    20.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
    21.         //获取根节点元素对象  
    22.         Element root = document.getRootElement();  
    23.         //遍历  
    24.         listNodes(root);  
    25.     }  
    26.       
    27.     //遍历当前节点下的所有节点  
    28.     public void listNodes(Element node){  
    29.         System.out.println("当前节点的名称:" + node.getName());  
    30.         //首先获取当前节点的所有属性节点  
    31.         List<Attribute> list = node.attributes();  
    32.         //遍历属性节点  
    33.         for(Attribute attribute : list){  
    34.             System.out.println("属性"+attribute.getName() +":" + attribute.getValue());  
    35.         }  
    36.         //如果当前节点内容不为空,则输出  
    37.         if(!(node.getTextTrim().equals(""))){  
    38.              System.out.println( node.getName() + ":" + node.getText());    
    39.         }  
    40.         //同时迭代当前节点下面的所有子节点  
    41.         //使用递归  
    42.         Iterator<Element> iterator = node.elementIterator();  
    43.         while(iterator.hasNext()){  
    44.             Element e = iterator.next();  
    45.             listNodes(e);  
    46.         }  
    47.     }  
    48. }  

    (3)解析结果

     
    1. 当前节点的名称:students  
    2. 当前节点的名称:student1  
    3. 属性id:001  
    4. 当前节点的名称:微信公众号  
    5. 微信公众号:@残缺的孤独  
    6. 当前节点的名称:学号  
    7. 学号:20140101  
    8. 当前节点的名称:地址  
    9. 地址:北京海淀区  
    10. 当前节点的名称:座右铭  
    11. 座右铭:要么强大,要么听话  
    12. 当前节点的名称:student2  
    13. 属性id:002  
    14. 当前节点的名称:新浪微博  
    15. 新浪微博:@残缺的孤独  
    16. 当前节点的名称:学号  
    17. 学号:20140102  
    18. 当前节点的名称:地址  
    19. 地址:北京朝阳区  
    20. 当前节点的名称:座右铭  
    21. 座右铭:在哭泣中学会坚强  

    4、dom4j操作节点属性

    使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。

    (1)代码示例

     
    1. @Test  
    2.     public void test2()throws Exception{  
    3.         //创建SAXReader对象  
    4.         SAXReader reader = new SAXReader();  
    5.         //读取文件 转换成Document  
    6.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
    7.         //获取根节点元素对象  
    8.         Element root = document.getRootElement();  
    9.           
    10.         System.out.println("-------添加属性前------");  
    11.         //获取节点student1  
    12.         Element student1Element = root.element("student1");  
    13.         //遍历  
    14.         listNodes(student1Element);  
    15.         //获取其属性  
    16.         Attribute idAttribute = student1Element.attribute("id");  
    17.         //删除其属性  
    18.         student1Element.remove(idAttribute);  
    19.         //为其添加新属性  
    20.         student1Element.addAttribute("name", "这是student1节点的新属性");  
    21.         System.out.println("-------添加属性后------");  
    22.         listNodes(student1Element);  
    23.     }  

    (2)结果

     
    1. -------添加属性前------  
    2. 当前节点的名称:student1  
    3. <span style="background-color: rgb(255, 0, 0);">属性id:001</span>  
    4. 当前节点的名称:微信公众号  
    5. 微信公众号:@残缺的孤独  
    6. 当前节点的名称:学号  
    7. 学号:20140101  
    8. 当前节点的名称:地址  
    9. 地址:北京海淀区  
    10. 当前节点的名称:座右铭  
    11. 座右铭:要么强大,要么听话  
    12. -------添加属性后------  
    13. 当前节点的名称:student1  
    14. <span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性  
    15. </span></span>当前节点的名称:微信公众号  
    16. 微信公众号:@残缺的孤独  
    17. 当前节点的名称:学号  
    18. 学号:20140101  
    19. 当前节点的名称:地址  
    20. 地址:北京海淀区  
    21. 当前节点的名称:座右铭  
    22. 座右铭:要么强大,要么听话  

    5、dom4j新增节点

    使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。

    (1)代码

     
    1. //添加节点  
    2.     @Test  
    3.     public void test3()throws Exception{  
    4.         //创建SAXReader对象  
    5.         SAXReader reader = new SAXReader();  
    6.         //读取文件 转换成Document  
    7.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
    8.         //获取根节点元素对象  
    9.         Element root = document.getRootElement();  
    10.         System.out.println("-------添加节点前------");  
    11.         //获取节点student1  
    12.         Element student1Element = root.element("student1");  
    13.         //遍历  
    14.         listNodes(student1Element);  
    15.         //添加phone节点  
    16.         Element phoneElement = student1Element.addElement("phone");  
    17.         //为phone节点设置值  
    18.         phoneElement.setText("137xxxxxxxx");  
    19.         System.out.println("-------添加节点后------");  
    20.         listNodes(student1Element);  
    21.     }  

    (2)结果

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. -------添加节点前------  
    2. 当前节点的名称:student1  
    3. 属性id:001  
    4. 当前节点的名称:微信公众号  
    5. 微信公众号:@残缺的孤独  
    6. 当前节点的名称:学号  
    7. 学号:20140101  
    8. 当前节点的名称:地址  
    9. 地址:北京海淀区  
    10. 当前节点的名称:座右铭  
    11. 座右铭:要么强大,要么听话  
    12. -------添加节点后------  
    13. 当前节点的名称:student1  
    14. 属性id:001  
    15. 当前节点的名称:微信公众号  
    16. 微信公众号:@残缺的孤独  
    17. 当前节点的名称:学号  
    18. 学号:20140101  
    19. 当前节点的名称:地址  
    20. 地址:北京海淀区  
    21. 当前节点的名称:座右铭  
    22. 座右铭:要么强大,要么听话  
    23. 当前节点的名称:phone  
    24. <span style="color:#ff0000;">phone:137xxxxxxxx</span>  

    6、把Document对象写入新的文件

    有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。

    (1)代码

     
    1. //添加节点后,写入新的文件  
    2.     @Test  
    3.     public void test4()throws Exception{  
    4.         //创建SAXReader对象  
    5.         SAXReader reader = new SAXReader();  
    6.         //读取文件 转换成Document  
    7.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
    8.         //获取根节点元素对象  
    9.         Element root = document.getRootElement();  
    10.         System.out.println("-------添加节点前------");  
    11.         //获取节点student1  
    12.         Element student1Element = root.element("student1");  
    13.         //遍历  
    14.         listNodes(student1Element);  
    15.         //添加phone节点  
    16.         Element phoneElement = student1Element.addElement("phone");  
    17.         //为phone节点设置值  
    18.         phoneElement.setText("137xxxxxxxx");  
    19.         System.out.println("-------添加节点后------");  
    20.         listNodes(student1Element);  
    21.         //把student1Element写入新文件  
    22.         writerDocumentToNewFile(document);  
    23.         System.out.println("---写入完毕----");  
    24.     }  
    25.       
    26.     //document写入新的文件  
    27.     public void writerDocumentToNewFile(Document document)throws Exception{  
    28.         //输出格式  
    29.         OutputFormat format = OutputFormat.createPrettyPrint();  
    30.         //设置编码  
    31.         format.setEncoding("UTF-8");  
    32.         //XMLWriter 指定输出文件以及格式  
    33.         XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);  
    34.           
    35.         //写入新文件  
    36.         writer.write(document);  
    37.         writer.flush();  
    38.         writer.close();  
    39.     }  

    (2)查看s1.xml文件

     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2.   
    3. <students>   
    4.   <student1 id="001">   
    5.     <微信公众号>@残缺的孤独</微信公众号>    
    6.     <学号>20140101</学号>    
    7.     <地址>北京海淀区</地址>    
    8.     <座右铭>要么强大,要么听话</座右铭>    
    9.     <phone>137xxxxxxxx</phone>  
    10.   </student1>    
    11.   <student2 id="002">   
    12.     <新浪微博>@残缺的孤独</新浪微博>    
    13.     <学号>20140102</学号>    
    14.     <地址>北京朝阳区</地址>    
    15.     <座右铭>在哭泣中学会坚强</座右铭>   
    16.   </student2>   
    17. </students>  

    因为涉及到中文,所以在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。

    还有输出格式的问题,在此处使用的是OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>  


    最后,为大家附上源代码。java dom4j解析xml

  • 相关阅读:
    Linux学习之路3-HelloWorld
    Linux学习之路2-linux系统烧写
    Linux学习之路1
    linux常用命令总结
    禅道配置发邮件功能
    SHELVE模块
    PICKLE模块
    JSON_dump和load
    json.dumps和loads方法
    模块调用
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/6079001.html
Copyright © 2011-2022 走看看