Andriod應用對XML的解析

  在Android系統中,對於XML文件的讀取主要採用的是SAX方法。SAX是一個用於處理XML事件驅動的“推”模型,雖然它不是W3C標準,但它卻是一個得到了廣泛認可的API。SAX解析器不像DOM那樣建立一個完整的文檔樹,而是在讀取文檔時激活一系列事件,這些事件被推給事件處理器,然後由事件處理器提供對文檔內容的訪問。  
常見的事件處理器有三種基本類型:  
  a. 用於訪問XML DTD內容的DTDHandler; 
  b. 用於低級訪問解析錯誤的ErrorHandler;  
  c. 用於訪問文檔內容的ContentHandler,這也是最普遍使用的事件處理器。
  因爲SAX具有邊掃描邊讀取的特性,無需將整個文件讀入內存中,更好的節省了移動設備中的資源。但是這種方法對於操作節點顯得略有複雜。
  下面以本人在學習中所看過的一個視頻教程中的實例,說明Android應用程序對於XML文檔的解析過程。

  用於開啓解析的Activity:

 

  1. public class XMLActitity extends Activity { 
  2.     /** Called when the activity is first created. */ 
  3.     private Button parseButton ; 
  4.     @Override 
  5.     public void onCreate(Bundle savedInstanceState) { 
  6.         super.onCreate(savedInstanceState); 
  7.         setContentView(R.layout.main); 
  8.         parseButton = (Button)findViewById(R.id.parseButton); 
  9.         parseButton.setOnClickListener(new ParseButtonListener()); 
  10.     } 
  11.     //設定監聽器,當點擊按鈕時,開始進行解析。 
  12.     class ParseButtonListener implements OnClickListener{ 
  13.  
  14.         @Override 
  15.         public void onClick(View v) { 
  16.             HttpDownloader hd = new HttpDownloader(); 
  17. //將網絡上的一個XML資源下載並解析成爲一個字符串,這裏的解析在一個外部類中進行,這裏不再列出。
  18.             String resultStr = hd.download("http://192.168.1.107:8081/voa1500/test.xml"); 
  19.             System.out.println(resultStr); 
  20.             try
  21. //下面是解析XML的
  22.                 //1. 創建一個SAXParserFactory 
  23.                 SAXParserFactory factory = SAXParserFactory.newInstance(); //2. 獲得一個XMLReader 
  24.                 XMLReader reader = factory.newSAXParser().getXMLReader(); 
  25.                 //3. 爲XMLReader設置內容處理器 
  26.                 reader.setContentHandler(new MyContentHandler()); 
  27.                 //4.開始解析文件。注意這個方法的參數,需要是輸入流。還有另外一種不同參數,需要時系統內部資源的URI 
  28.                 reader.parse(new InputSource(new StringReader(resultStr))); 
  29.                  
  30.             } 
  31.             catch(Exception e){ 
  32.                 e.printStackTrace(); 
  33.             } 
  34.         } 
  35.          
  36.     } 

 

  內容處理器:

  SAX時間作爲驅動的解析模型,需要相應的事件處理函數。SAX將不同的事件處理函數按照類型分不同接口中。對於文件內容的處理函數,在內容處理器接口(ContentHandler)中。

 

  1. public class MyContentHandler extends DefaultHandler { 
  2.     String hisname, address, money, sex, status; 
  3.     String tagName; 
  4.  
  5. //當開始解析文檔時,觸發這個函數
  6.     public void startDocument() throws SAXException { 
  7.         System.out.println("````````begin````````"); 
  8.     } 
  9.   //當結束解析文檔時,觸發這個函數
  10.     public void endDocument() throws SAXException { 
  11.         System.out.println("````````end````````"); 
  12.     } 
  13.   //當掃描到開始標籤時,觸發這個函數。
  14.     public void startElement(String namespaceURI, String localName, 
  15.             String qName, Attributes attr) throws SAXException { 
  16.         //使用全局變量tagName作爲當前正在解析節點的標記。
  17. tagName = localName; 
  18.         if (localName.equals("worker")) { 
  19.             //獲取標籤的全部屬性。標籤的所有屬性存儲在數組中。 
  20.             for (int i = 0; i < attr.getLength(); i++) {
  21. //打印其中某個屬性的名稱和屬性值 
  22.                 System.out.println(attr.getLocalName(i) + "=" + attr.getValue(i)); 
  23.             } 
  24.         } 
  25.     } 
  26.  
  27.     public void endElement(String namespaceURI, String localName, String qName) 
  28.             throws SAXException { 
  29.         //在workr標籤解析完之後,會打印出所有得到的數據 
  30.         tagName = ""
  31.         if (localName.equals("worker")) { 
  32.             this.printout(); 
  33.         } 
  34.     } 
  35. //當掃描到標籤內容時,觸發這個函數。標籤的內容存儲在字符數組中。
  36.     public void characters(char[] ch, int start, int length) 
  37.             throws SAXException { 
  38. //首先判斷當前掃描到的標籤,然後根據當前標籤判斷標籤內容
  39.         if (tagName.equals("name")) 
  40.             hisname = new String(ch, start, length); 
  41.         else if (tagName.equals("sex")) 
  42.             sex = new String(ch, start, length); 
  43.         else if (tagName.equals("status")) 
  44.             status = new String(ch, start, length); 
  45.         else if (tagName.equals("address")) 
  46.             address = new String(ch, start, length); 
  47.         else if (tagName.equals("money")) 
  48.             money = new String(ch, start, length); 
  49.     } 
  50.  
  51.     private void printout() { 
  52.         System.out.print("name: "); 
  53.         System.out.println(hisname); 
  54.         System.out.print("sex: "); 
  55.         System.out.println(sex); 
  56.         System.out.print("status: "); 
  57.         System.out.println(status); 
  58.         System.out.print("address: "); 
  59.         System.out.println(address); 
  60.         System.out.print("money: "); 
  61.         System.out.println(money); 
  62.         System.out.println(); 
  63.     } 
  64.  

   在上面程序中,需要注意,我們並非實現了ContentHandler接口,而是繼承了已經實現該接口的DefaultHandler。我再付類中已經實現了接口中所有方法,並將方法實現爲空方法,我們繼承父類只需要重寫那些我們需要的方法即可。

 

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