JAVA 使用Dom4j 解析XML

解析XML的方式有不少,本文介紹使用dom4j解析xml。html

一、環境準備java

(1)下載dom4j-1.6.1.jarnode

(2)下載junit-4.10.jar微信

二、舒適提示dom

解析XML過程是經過獲取Document對象,而後繼續獲取各個節點以及屬性等操做,所以獲取Document對象是第一步,大致說來,有三種方式:編碼

(1)本身建立Document對象spa

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片.net

  1. Document document = DocumentHelper.createDocument();  code

  2.         Element root = document.addElement("students");  orm

其中students是根節點,能夠繼續添加其餘節點等操做。

(2)讀取XML文件獲取Document對象

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  1. //建立SAXReader對象  

  2.         SAXReader reader = new SAXReader();  

  3.         //讀取文件 轉換成Document  

  4.         Document document = reader.read(new File("XXXX.xml"));  

(3)讀取XML文本內容獲取Document對象

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  1. String xmlStr = "<students>......</students>";  

  2.         Document document = DocumentHelper.parseText(xmlStr);  

三、示例

(1)xml文件內容以下

[html] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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)解析過程

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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)解析結果

[html] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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. 座右銘:在哭泣中學會堅強  

四、dom4j操做節點屬性

使用dom4j能夠操做節點屬性,好比添加節點屬性、刪除節點屬性、修改屬性值等操做。下面使用dom4j爲上述的student1節點刪除id屬性,新添name屬性。

(1)代碼示例

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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)結果

[html] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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. 座右銘:要麼強大,要麼聽話  

五、dom4j新增節點

使用dom4j能夠刪除指定節點、新增節點等操做,咱們使用dom4j爲student1節點新增phone節點,以下。

(1)代碼

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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 plaincopyprint?在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>  

六、把Document對象寫入新的文件

有時,咱們須要把document對象寫入新的文件,dom4j提供了對應的API以便咱們進行操做。咱們在完成第 5 後,把document寫入新的文件s1.xml,以下。

(1)代碼

[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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文件

[html] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  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()方法,輸出內容是一行,沒有進行格式化,是緊湊型的輸出。以下:

[html] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <students><student1 id="001"><微信公衆號>@殘缺的孤獨</微信公衆號><學號>20140101</學號><地址>北京海淀區</地址><座右銘>要麼強大,要麼聽話</座右銘><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@殘缺的孤獨</新浪微博><學號>20140102</學號><地址>北京朝陽區</地址><座右銘>在哭泣中學會堅強</座右銘></student2></students> 

相關文章
相關標籤/搜索