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

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

編輯:關於android開發

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

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

XML/HTML代碼
  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的結果如下: 

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

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

Java代碼
  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的操作。生成XML的結果如下:

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

       上圖是讀取各節點之後,使用XmlSerializer重新組合並輸出XML字符串。本文的main.xml代碼如下:

XML/HTML代碼
  1. <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         android:orientation="vertical" android:layout_width="fill_parent"  
  3.         android:layout_height="fill_parent">  
  4.   
  5.         <button android:layout_height="wrap_content"   
  6.                 android:layout_width="fill_parent" android:id="@+id/btnSAX"  
  7.                 android:text="使用SAX解析XML">  
  8.         <button android:layout_height="wrap_content"   
  9.                 android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput">  
  10.         <edittext android:text="@+id/EditText01" android:id="@+id/EditText01"   
  11.                 android:layout_width="fill_parent" android:layout_height="fill_parent">  

       testSAX.java的源碼如下:

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.    class ClickEvent implements View.OnClickListener {    
  39.       @Override  
  40.       public void onClick(View v) {  
  41.           if (v == btnSAX) {//解析XML,並保存標記,屬性等值  
  42.               try {  
  43.                  SAXParserFactory factory = SAXParserFactory.newInstance();  
  44.                  SAXParser parser = factory.newSAXParser();  
  45.                  XMLReader reader = parser.getXMLReader();  
  46.                  reader.setContentHandler(handler);  
  47.                  reader.parse(new InputSource(testSAX.this.getResources()  
  48.                                                         .openRawResource(R.raw.test)));  
  49.               } catch (Exception ee) {}  
  50.           } else if (v == btnOutput) {//生成XML  
  51.               try {  
  52.                  XmlSerializer serializer = Xml.newSerializer();  
  53.                  StringWriter writer = new StringWriter();  
  54.                  try {  
  55.                     serializer.setOutput(writer);  
  56.                     serializer.startDocument("UTF-8",true);  
  57.                                                   
  58.                     for(int i=0;i<handler.getkeys().size();i++)  
  59.                     {  
  60.                        if(handler.GetKeys().get(i).equals("startTag"))  
  61.                        {  
  62.                           serializer.startTag("", (String) handler.GetValues().get(i));  
  63.                        }else if(handler.GetKeys().get(i).equals("Attr")){  
  64.                           String[] str= (String[]) handler.GetValues().get(i);  
  65.                           serializer.attribute("",str[0],str[1]);  
  66.                        }else if(handler.GetKeys().get(i).equals("text"))  
  67.                           serializer.text((String)handler.GetValues().get(i));  
  68.                        else if(handler.GetKeys().get(i).equals("endTag"))  
  69.                        {  
  70.                           serializer.endTag("", (String) handler.GetValues().get(i));  
  71.                        }  
  72.                     }  
  73.                     serializer.endDocument();  
  74.                     String text=writer.toString();  
  75.                     text=text.replace("><", ">/r/n<");  
  76.                     memo.setText(text);//輸出到文本框  
  77.                 } catch (Exception e) {  
  78.                     throw new RuntimeException(e);  
  79.                 }  
  80.                                           
  81.              } catch (Exception e) {}  
  82.          }  
  83.      }  
  84.    }  
  85. }  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved