Jdom解析嵌套XML<一>

本博文主要採用Jdom對XML 進行了詳細的解析(包括了嵌套的XML、XML格式的字符串、XML文件以及XPATH的使用等等),基本能夠滿足了平時工作之中所遇到的所有解析XML 工作。


搭建Jdom 解析環境
        給項目添加資源jar包:jdom-2.0.1.jar
具體解析方法

        Jdom 的解析器(SAXBuilder)在org.jdom2.input.*這個包裏,其中的DOMBuilder 的功能是將DOM 模型的Document解析成Jdom 模型的Document;SAXBuilder 的功能是從文件或者流中解析解析出符合JDOM模型的XML樹。


①解析XML 文件的代碼

  1. // 創建一個 SAXBuilder 
  2. SAXBuilder saxBuilder = new SAXBuilder(); 
  3.  
  4. try { 
  5. // 給XML 文件構造一個Document 
  6. Document document = saxBuilder.build("resources/Classinfo.xml"); 
  7.  
  8. // 獲取根元素 
  9. Element root = document.getRootElement(); 
  10.  
  11. catch (JDOMException e) { 
  12. // TODO Auto-generated catch block 
  13. e.printStackTrace(); 
  14.  
  15. catch (IOException e) { 
  16. // TODO Auto-generated catch block 
  17. e.printStackTrace(); 
  18.  

②解析XML 字符串的代碼

  1. // 創建測試 XML 
  2. String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
  3. +"<class>" 
  4. +"<name>五年級</name>" 
  5. +"<teacher>張老師</teacher>" 
  6. +"<students>" 
  7. +"<student schoolNo=\"5001\"><name>小明</name><sex>男</sex></student>" 
  8. +"<student schoolNo=\"5002\"><name>小紅</name><sex>女</sex></student>" 
  9. +"</students>" 
  10. +"</class>"
  11.  
  12. // 創建一個字符串的字符流 
  13. StringReader reader = new StringReader(xmlString); 
  14.  
  15. // 創建新的輸入源 SAX 解析將使用的InputSource 對象來讀取 XML  
  16. InputSource source = new InputSource(reader); 
  17.  
  18. // 創建一個 SAXBuilder 
  19. SAXBuilder saxBuilder = new SAXBuilder(); 
  20.  
  21. try { 
  22. // 通過輸入源構造一個Document 
  23. Document document = saxBuilder.build(source); 
  24.  
  25. // 獲取根元素 
  26. Element root = document.getRootElement(); 
  27.  
  28. catch (JDOMException e) { 
  29.     // TODO Auto-generated catch block 
  30.     e.printStackTrace(); 
  31. catch (IOException e) { 
  32.     // TODO Auto-generated catch block 
  33.     e.printStackTrace(); 

PS:其實解析XML 格式的字符串就是解析XML 流!


Jdom的Element 對象常用的方法:

方  法 說  明
getChild("childname") 返回指定名字的子節點,如果同一級有多個同名子節點,則只返回第一個;如果沒有返回null值
getChildren("childname") 返回指定名字的子節點List集合。這樣你就可以遍歷所有的同一級同名子節點。
getAttributeValue("name") 返回指定屬性名字的值。如果沒有該屬性則返回null,有該屬性但是值爲空,則返回空字符串。
getChildText("childname") 返回指定子節點的內容文本值。
getText() 返回該元素的內容文本值。

 

完整解析代碼

  1. /** 
  2.  * Create by [email protected] in 2012-5-15 
  3.  */ 
  4. package com.javawill.analysis; 
  5.  
  6. import java.io.IOException; 
  7. import java.io.StringReader; 
  8. import java.util.Iterator; 
  9. import java.util.List; 
  10.  
  11. import org.jdom2.Document; 
  12. import org.jdom2.Element; 
  13. import org.jdom2.JDOMException; 
  14. import org.jdom2.input.SAXBuilder; 
  15. import org.xml.sax.InputSource; 
  16.  
  17. /** 
  18.  * 解析 XML 字符串類 
  19.  * @author <a href="mailto:[email protected]">WillKinG</a> 
  20.  * @version 1.0 
  21.  */ 
  22. public class AnalysisXmlString { 
  23.     /** 
  24.      * 解析方法 
  25.      */ 
  26.     public void analysis(){ 
  27.         // 創建測試 XML 
  28.         String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
  29.             +"<class>" 
  30.             +"<name>五年級</name>" 
  31.             +"<teacher>張老師</teacher>" 
  32.             +"<students>" 
  33.             +"<student schoolNo=\"5001\"><name>小明</name><sex>男</sex></student>" 
  34.             +"<student schoolNo=\"5002\"><name>小紅</name><sex>女</sex></student>" 
  35.             +"</students>" 
  36.             +"</class>"
  37.          
  38.         // 創建一個字符串的字符流 
  39.         StringReader reader = new StringReader(xmlString); 
  40.          
  41.         // 創建新的輸入源 SAX 解析將使用的InputSource 對象來讀取 XML  
  42.         InputSource source = new InputSource(reader); 
  43.          
  44.         // 創建一個 SAXBuilder 
  45.         SAXBuilder saxBuilder = new SAXBuilder(); 
  46.          
  47.         try { 
  48.             // 通過輸入源構造一個Document 
  49.             Document document = saxBuilder.build(source); 
  50.              
  51.             // 獲取根元素 
  52.             Element root = document.getRootElement(); 
  53.              
  54.             // 獲取Class 信息 
  55.             String clzName = root.getChildText("name"); 
  56.             String clzTeacher = root.getChildText("teacher"); 
  57.             System.out.println("Class Name:" + clzName + ";Class Teacher:" + clzTeacher); 
  58.              
  59.             // 解析班級中的學生 
  60.             Element stuRoot = root.getChild("students"); 
  61.             List list = stuRoot.getChildren("student"); 
  62.             System.out.println("---- 班級共有" + list.size() + "名學生 ----"); 
  63.              
  64.             for (Iterator it = list.iterator(); it.hasNext();) { 
  65.                 Element student = (Element) it.next(); 
  66.                  
  67.                 // 獲取Student 信息 
  68.                 String stuNo = student.getAttributeValue("schoolNo"); 
  69.                  
  70.                 String stuName = student.getChildText("name"); 
  71.                 String stuSex = student.getChildText("sex"); 
  72.                  
  73.                 System.out.println("Student No:" + stuNo + ";Student Name:" + stuName + ";Student Sex:" + stuSex); 
  74.             } 
  75.         } catch (JDOMException e) { 
  76.             // TODO Auto-generated catch block 
  77.             e.printStackTrace(); 
  78.         } catch (IOException e) { 
  79.             // TODO Auto-generated catch block 
  80.             e.printStackTrace(); 
  81.         } 
  82.     } 
  83.     /** 
  84.      * 執行方法 
  85.      * @param args 
  86.      */ 
  87.     public static void main(String[] args) { 
  88.         AnalysisXmlString analysisXml = new AnalysisXmlString(); 
  89.         analysisXml.analysis(); 
  90.     } 

運行上面的代碼,控制檯返回值

  1. Class Name:五年級;Class Teacher:張老師 
  2. ---- 班級共有2名學生 ---- 
  3. Student No:5001;Student Name:小明;Student Sex:男 
  4. Student No:5002;Student Name:小紅;Student Sex:女 

小弟技術有限,第一次寫技術博文,其中多有不合理的、錯誤的地方,還請各位大蝦見諒指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章