【Android網絡開發の1】XML之DOM方式 解析和生成XML文件

 本章內容我們學習 如何使用DOM方式去解析和生成XML

一、DOM解析XML

    DOM是基於樹形結構的的節點或信息片段的集合,允許開發人員使用DOM API遍歷XML樹、檢索所需數據。分析該結構通常需要加載整個文檔和構造樹形結構,然後纔可以檢索和更新節點信息。Android完全支持DOM 解析。利用DOM中的對象,可以對XML文檔進行讀取、搜索、修改、添加和刪除等操作。

    DOM的工作原理:使用DOM對XML文件進行操作時,首先要解析文件,將文件分爲獨立的元素、屬性和註釋等,然後以節點樹的形式在內存中對XML文件進行表示,就可以通過節點樹訪問文檔的內容,並根據需要修改文檔——這就是DOM的工作原理。

DOM實現時首先爲XML文檔的解析定義一組接口,解析器讀入整個文檔,然後構造一個駐留內存的樹結構,這樣代碼就可以使用DOM接口來操作整個樹結構。

DOM的優點

    由於DOM在內存中以樹形結構存放,因此檢索和更新效率會更高。

DOM的缺點

    但是對於特別大的文檔,解析和加載整個文檔將會很耗資源。 當然,如果XML文件的內容比較小,採用DOM是可行的。

 常用的DoM接口和類:

Document 該接口定義分析並創建DOM文檔的一系列方法,它是文檔樹的根,是操作DOM的基礎。 
Element 該接口繼承Node接口,提供了獲取、修改XML元素名字和屬性的方法。
Node 該接口提供處理並獲取節點和子節點值的方法。
NodeList 提供獲得節點個數和當前節點的方法。這樣就可以迭代地訪問各個節點。
DOMParser 該類是Apache的Xerces中的DOM解析器類,可直接解析XML文件。

 

下面是解析的流程

  1. //      *首先利用DocumentBuilderFactory創建一個DocumentBuilderFactory實例 
  2. //      *然後利用DocumentBuilderFactory創建DocumentBuilder 
  3. // 
  4. //      *然後加載XML文檔(Document), 
  5. //      * 然後獲取文檔的根結點(Element), 
  6. //      * 然後獲取根結點中所有子節點的列表(NodeList), 
  7. //      * 然後使用再獲取子節點列表中的需要讀取的結點。 

講了這麼多了  接下來寫個例子來解析下吧

說到解析 肯定要有xml文件啦    我們把xml文件放在assets目錄下  文件內容爲

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <persons> 
  3.     <person id="23"> 
  4.         <name>李磊</name> 
  5.         <age>30</age> 
  6.     </person> 
  7.     <person id="20"> 
  8.         <name>韓梅梅</name> 
  9.         <age>25</age> 
  10.     </person> 
  11. </persons> 

新建一個Values類  用來存儲數據

  1. package com.example.demo; 
  2.  
  3. import java.io.Serializable; 
  4.  
  5. public class Values implements Serializable { 
  6.  
  7.     /** 
  8.      *  
  9.      */ 
  10.     private static final long serialVersionUID = 1L; 
  11.     private String _id; 
  12.     private String _name; 
  13.     private String _age; 
  14.  
  15.     public String get_id() { 
  16.         return _id; 
  17.     } 
  18.  
  19.     public void set_id(String _id) { 
  20.         this._id = _id; 
  21.     } 
  22.  
  23.     public String get_name() { 
  24.         return _name; 
  25.     } 
  26.  
  27.     public void set_name(String _name) { 
  28.         this._name = _name; 
  29.     } 
  30.  
  31.     public String get_age() { 
  32.         return _age; 
  33.     } 
  34.  
  35.     public void set_age(String _age) { 
  36.         this._age = _age; 
  37.     } 

接下來編寫解析的方法  注視都在下面的代碼中寫出

  1. public void getDomXML(InputStream is){ 
  2.          
  3.         //創建list 用於保存讀取的內容 
  4.         List<Values> list  = new ArrayList<Values>(); 
  5.          
  6.         //得到DocumentBuilderFactory對象  由該對象可以得到 DocumentBuilder 對象 
  7.         DocumentBuilderFactory builderFactory  = DocumentBuilderFactory.newInstance(); 
  8.          
  9.         try { 
  10.             //得到DocumentBuilder對象  
  11.             DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
  12.             //得到代表整個xml的Document對象 
  13.             Document document = builder.parse(is); 
  14.             //得到根節點 
  15.             Element element = document.getDocumentElement(); 
  16.             //獲取根節點中的所有的person節點 
  17.             NodeList nodeList = element.getElementsByTagName("person"); 
  18.             //獲取長度 
  19.             int length = nodeList.getLength(); 
  20.              
  21.             for (int i = 0; i < length; i++) { 
  22.                 Values values = new Values(); 
  23.                 Element element2 = (Element) nodeList.item(i); 
  24.                 values.set_id(element2.getAttribute("id")); 
  25.                 //獲取節點中的子節點list 
  26.                 NodeList childnodes = element2.getChildNodes(); 
  27.                 //遍歷子節點 
  28.                 for (int j = 0; j < childnodes.getLength(); j++) { 
  29.                     //獲取當前節點 
  30.                     Node node  = childnodes.item(j); 
  31.                     //如果當前節點是元素節點的話  getNodeType()獲取節點類型 
  32.                     if(node.getNodeType()  == Node.ELEMENT_NODE){ 
  33.                         //判斷節點名稱是否是 age 
  34.                         if(node.getNodeName().equals("age")){ 
  35.                             //獲取節點值 
  36.                             values.set_age(node.getFirstChild().getNodeValue()); 
  37.                         } 
  38.                         else if(node.getNodeName().equals("name")){ 
  39.                             values.set_name(node.getFirstChild().getNodeValue()); 
  40.                         } 
  41.                     } 
  42.                 } 
  43.                 list.add(values); 
  44.             } 
  45.         } catch (Exception e) { 
  46.             // TODO: handle exception  
  47.             System.err.println(e.toString()); 
  48.             return
  49.         } 
  50.          
  51.         //下面的代碼將解析的內容打印出來 
  52.         StringBuffer buffer = new StringBuffer(); 
  53.         int length = list.size(); 
  54.         for (int i = 0; i < length; i++) { 
  55.             Values values = list.get(i); 
  56.             if(values.get_id()!=null
  57.                 buffer.append(values.get_id()+"\t"); 
  58.              
  59.             if(values.get_name()!=null
  60.                 buffer.append(values.get_name()+"\t"); 
  61.          
  62.             if(values.get_age()!=null
  63.                 buffer.append(values.get_age()+"\n"); 
  64.              
  65.         } 
  66.          
  67.         Toast.makeText(activity, buffer, Toast.LENGTH_LONG).show(); 
  68.          
  69.     } 

運行方法 得到如下圖的內容  說明解析成功

如果xml來源不是文件  而是String字符串?  應該怎麼做? 就是把xml字符串轉換爲InputStream

  1. String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"  
  2.                     + "<persons>    <person id=\"23\">  <name>李磊</name>     <age>30</age>   </person>"  
  3.                     + " <person id=\"20\">      <name>韓梅梅</name>        <age>25</age>   </person></persons>";  
  4. //轉換爲inputStream類型  
  5. InputStream is = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));  

 


 二、DOM生成XML

寫完解析 我們來寫生成

也是使用上面的數據 

下面是生成的代碼,註釋都寫了

  1. /** 
  2.  * 生成xml 
  3.  * */ 
  4. public void createXML() { 
  5.     // TODO Auto-generated method stub 
  6.     // 模擬數據 
  7.     List<Values> list = createValues(); 
  8.  
  9.     DocumentBuilderFactory builderFactory = DocumentBuilderFactory 
  10.             .newInstance(); 
  11.     try { 
  12.  
  13.         DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
  14.  
  15.         Document document = builder.newDocument(); 
  16.         // 建立根節點 person 
  17.         Element element = document.createElement("persons"); 
  18.         // 添加到document 
  19.         document.appendChild(element); 
  20.  
  21.         for (int i = 0; i < list.size(); i++) { 
  22.             Values values = list.get(i); 
  23.             // 建立節點person 
  24.             Element person = document.createElement("person"); 
  25.             // 添加id屬性 
  26.             person.setAttribute("id", values.get_id()); 
  27.             // 把節點添加到document 
  28.             element.appendChild(person); 
  29.  
  30.             // 添加name元素 
  31.             Element name = document.createElement("name"); 
  32.             //給name元素設置值 
  33.             name.setTextContent(values.get_name()); 
  34.             //添加到person節點 
  35.             person.appendChild(name); 
  36.  
  37.             // 添加age元素 
  38.             Element age = document.createElement("age"); 
  39.             age.setTextContent(values.get_age()); 
  40.             person.appendChild(age); 
  41.         } 
  42.          
  43.         //設置輸出結果 
  44.         DOMSource domSource = new DOMSource(document); 
  45.         StringWriter writer = new StringWriter(); 
  46.         StreamResult result = new StreamResult(writer); 
  47.         TransformerFactory factory = TransformerFactory.newInstance(); 
  48.         Transformer transformer = factory.newTransformer(); 
  49.         //開始把Document映射到result  
  50.         transformer.transform(domSource, result); 
  51.          
  52.         Toast.makeText(activity, writer.toString(), Toast.LENGTH_LONG).show(); 
  53.     } catch (Exception e) { 
  54.         // TODO: handle exception 
  55.         e.printStackTrace(); 
  56.     } 
  57.  

運行方法之後  如果顯示下面的圖,那就說明生成成功了

下面給出測試代碼生成的方法

  1. private List<Values> createValues() { 
  2.         // 模擬數據 
  3.         List<Values> list = new ArrayList<Values>(); 
  4.         Values values = new Values(); 
  5.         values.set_id("23"); 
  6.         values.set_name("李磊"); 
  7.         values.set_age("30"); 
  8.         list.add(values); 
  9.  
  10.         values = new Values(); 
  11.         values.set_id("20"); 
  12.         values.set_name("韓梅梅"); 
  13.         values.set_age("25"); 
  14.         list.add(values); 
  15.  
  16.         return list; 
  17.     } 

概括流程:

  1. //創建Document  
  2. //  ↓↓ 
  3. //創建主節點 添加到document  
  4. //  ↓↓ 
  5. //創建節點   添加到主節點  
  6. //  ↓↓ 
  7. //創建元素   設置值  添加到節點  
  8. //  ↓↓ 
  9. //生成成功  

DOM方式的解析和生成已經講完了   

下面一章將講解SAX的解析和生成

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