Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android提高第七篇之XML解析與生成

Android提高第七篇之XML解析與生成

編輯:Android開發實例

       本文使用SAX來解析XML,在Android裡面可以使用SAX和DOM,DOM需要把整個XML文件讀入內存再解析,比較消耗內存,而SAX基於事件驅動的處理方式,可以在各節點觸發回調函數,不過SAX適合節點結構簡單的XML文檔,復雜的XML文檔在後期的節點深度處理會有點麻煩。

本文要解析的test.xml文件如下:

 

 
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <test>   
  3.   <title>testSAX</title>   
  4.     <content aa="1" bb="2">   
  5.       <name>hellogv</name>   
  6.       <url>http://blog.csdn.net/hellogv</url>   
  7.     </content> 
  8. </test>  
  

 

 

解析如上XML的結果如下:

 

使用SAX解析,需要定義SAXParserFactory(使應用程序能夠配置和獲取基於 SAX 的解析器以解析 XML 文檔),SAXParser(從各種輸入源解析 XML),XMLReader(使用回調函數讀取 XML 文檔),其中XMLReader是個關鍵。XMLReader可以為解析XML定義各種回調函數,“條件符合”的時候觸發這些回調函數。

 

 
  1. SAXParserFactory factory = SAXParserFactory.newInstance();  
  2. SAXParser parser = factory.newSAXParser();  
  3. XMLReader reader = parser.getXMLReader();  
  4. reader.setContentHandler(handler);  
  5. reader.parse(new InputSource(testSAX.this.getResources()  
  6.         .openRawResource(R.raw.test))); 
 

 

在這段代碼裡,XMLReader就調用繼承DefaultHandler的SAXHandler。DefaultHandler已實現ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常見讀取XML的操作,具體請看下面的SAXHandler.java源碼。

生成XML的結果如下:

上圖是讀取各節點之後,使用XmlSerializer重新組合並輸出XML字符串。

本文的main.xml代碼如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent"> 
  5.  
  6.     <Button android:layout_height="wrap_content" 
  7.         android:layout_width="fill_parent" android:id="@+id/btnSAX" 
  8.         android:text="使用SAX解析XML"></Button> 
  9.     <Button android:layout_height="wrap_content" 
  10.         android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput"></Button> 
  11.     <EditText android:text="@+id/EditText01" android:id="@+id/EditText01" 
  12.         android:layout_width="fill_parent" android:layout_height="fill_parent"></EditText> 
  13.  
  14. </LinearLayout> 

 

 

 

SAXHandler.java的源碼如下:

  1. package com.testSAX;  
  2.  
  3. import java.util.ArrayList;  
  4. import org.xml.sax.Attributes;  
  5. import org.xml.sax.SAXException;  
  6. import org.xml.sax.helpers.DefaultHandler;  
  7.  
  8. import android.util.Log;  
  9.  
  10. public class SAXHandler extends DefaultHandler{  
  11.         private ArrayList<String> keys = new ArrayList<String>();//保存字段名稱  
  12.         private ArrayList<Object> values = new ArrayList<Object>();//保存值  
  13.         @Override 
  14.         public void startDocument() throws SAXException {  
  15.             super.startDocument();  
  16.  
  17.         }  
  18.  
  19.         @Override 
  20.         public void endDocument() throws SAXException {  
  21.             super.endDocument();  
  22.         }  
  23.  
  24.         @Override 
  25.         public void startElement(String uri, String localName, String qName,  
  26.                 Attributes attributes) throws SAXException {  
  27.             //保存開始標記  
  28.             keys.add("startTag");  
  29.             values.add(localName);  
  30.  
  31.             Log.e("startTag",localName);  
  32.             //保存屬性值  
  33.             for ( int i = 0; i < attributes.getLength(); i++ ){  
  34.                 keys.add("Attr");  
  35.                 String[] str=new String[2];  
  36.                 str[0]=attributes.getLocalName(i);  
  37.                 str[1]=attributes.getValue(i);  
  38.                 values.add(str);  
  39.                 Log.e("Attr",str[0]+"="+str[1]);  
  40.                 }  
  41.         }  
  42.  
  43.         @Override 
  44.         public void endElement(String uri, String localName, String qName)  
  45.                 throws SAXException {  
  46.             //保存結束標記  
  47.             keys.add("endTag");  
  48.             values.add(localName);  
  49.             Log.e("endTag",localName);  
  50.         }  
  51.  
  52.         @Override 
  53.         public void characters(char[] ch, int start, int length)  
  54.                 throws SAXException {  
  55.             String value = new String(ch, start, length);  
  56.             value = value.trim();  
  57.             if (value.length() == 0)  
  58.                 return;  
  59.               
  60.             keys.add("text");  
  61.             values.add(value);  
  62.             Log.e("text",value);  
  63.         }  
  64.           
  65.         public ArrayList<String> GetKeys()  
  66.         {  
  67.             return keys;  
  68.         }  
  69.           
  70.         public ArrayList<Object> GetValues()  
  71.         {  
  72.             return values;  
  73.         }  
  74.           
  75.  
  76. }  

 

 

testSAX.java的源碼如下:

 

  1. package com.testSAX;     
  2.     
  3. import java.io.StringWriter;     
  4.     
  5. import javax.xml.parsers.SAXParser;     
  6. import javax.xml.parsers.SAXParserFactory;     
  7.     
  8. import org.xml.sax.InputSource;     
  9. import org.xml.sax.XMLReader;     
  10. import org.xmlpull.v1.XmlSerializer;     
  11.     
  12. import android.app.Activity;     
  13. import android.os.Bundle;     
  14.     
  15. import android.util.Xml;     
  16. import android.view.View;     
  17. import android.widget.Button;     
  18. import android.widget.EditText;     
  19.     
  20. public class testSAX extends Activity {     
  21.     /** Called when the activity is first created. */    
  22.     Button btnSAX, btnOutput;     
  23.     EditText memo;     
  24.     SAXHandler handler = new SAXHandler();     
  25.     
  26.          
  27.     @Override    
  28.     public void onCreate(Bundle savedInstanceState) {     
  29.         super.onCreate(savedInstanceState);     
  30.         setContentView(R.layout.main);     
  31.         btnSAX = (Button) this.findViewById(R.id.btnSAX);     
  32.         btnSAX.setOnClickListener(new ClickEvent());     
  33.         btnOutput = (Button) this.findViewById(R.id.btnOutput);     
  34.         btnOutput.setOnClickListener(new ClickEvent());     
  35.         memo = (EditText) this.findViewById(R.id.EditText01);     
  36.     
  37.     }     
  38.     
  39.     class ClickEvent implements View.OnClickListener {     
  40.     
  41.         @Override    
  42.         public void onClick(View v) {     
  43.             if (v == btnSAX) {//解析XML,並保存標記,屬性等值     
  44.                 try {     
  45.                     SAXParserFactory factory = SAXParserFactory.newInstance();     
  46.                     SAXParser parser = factory.newSAXParser();     
  47.                     XMLReader reader = parser.getXMLReader();     
  48.                     reader.setContentHandler(handler);     
  49.                     reader.parse(new InputSource(testSAX.this.getResources()     
  50.                             .openRawResource(R.raw.test)));     
  51.                 } catch (Exception ee) {}     
  52.             }     
  53.             else if (v == btnOutput) {//生成XML     
  54.                 try {     
  55.                     XmlSerializer serializer = Xml.newSerializer();     
  56.                     StringWriter writer = new StringWriter();     
  57.                     try {     
  58.                         serializer.setOutput(writer);     
  59.                         serializer.startDocument("UTF-8",true);     
  60.                              
  61.                         for(int i=0;i<handler.GetKeys().size();i++)     
  62.                         {     
  63.                             if(handler.GetKeys().get(i).equals("startTag"))     
  64.                             {     
  65.                                 serializer.startTag("", (String) handler.GetValues().get(i));     
  66.                             }     
  67.                             else if(handler.GetKeys().get(i).equals("Attr")){     
  68.                                 String[] str= (String[]) handler.GetValues().get(i);     
  69.                                 serializer.attribute("",str[0],str[1]);     
  70.                             }     
  71.                             else if(handler.GetKeys().get(i).equals("text"))     
  72.                                 serializer.text((String)handler.GetValues().get(i));     
  73.                             else if(handler.GetKeys().get(i).equals("endTag"))     
  74.                             {     
  75.                                 serializer.endTag("", (String) handler.GetValues().get(i));     
  76.                             }     
  77.                         }     
  78.                         serializer.endDocument();     
  79.                         String text=writer.toString();     
  80.                         text=text.replace("><", ">\r\n<");     
  81.                         memo.setText(text);//輸出到文本框     
  82.                     } catch (Exception e) {     
  83.                         throw new RuntimeException(e);     
  84.                     }     
  85.                          
  86.                 } catch (Exception e) {}     
  87.             }     
  88.     
  89.         }     
  90.     
  91.     }     
  92. }    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved