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)结果
    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
  • 相关阅读:
    poj 1113 Wall 凸包的应用
    NYOJ 78 圈水池 (入门级凸包)
    Monotone Chain Convex Hull(单调链凸包)
    poj Sudoku(数独) DFS
    poj 3009 Curling 2.0(dfs)
    poj 3083 Children of the Candy Corn
    Python join()方法
    通过FISH和下一代测序检测肺腺癌ALK基因融合比较
    华大病原微生物检测
    NGS检测ALK融合大起底--转载
  • 原文地址:https://www.cnblogs.com/pekkle/p/6568726.html
Copyright © 2011-2022 走看看