Android,XML解析


XML解析三種方式

DOM

通用性強,它會將XML文件的所有內容讀取到內存中,然后允許您使用DOM API遍歷XML樹、檢索所需的數據;

簡單直觀,但需要將文檔讀取到內存,並不太適合移動設備;

SAX

SAX是一個解析速度快並且占用內存少的xml解析器;

采用事件驅動,它並不需要解析整個文檔;

實現:繼承DefaultHandler,覆寫startElement、endElement、characters等方法;

PULL

Android自帶的XML解析器,和SAX基本類似,也是事件驅動,不同的是PULL事件返回的是數值型;推薦使用。

 

PULL解析XML核心代碼

[java]  view plaincopy
 
  1. XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();  
  2. parser.setInput(fileInputStream, “utf-8”);//設置數據源編碼  
  3. int eventCode = parser.getEventType();//獲取事件類型  
  4. while(eventCode != XmlPullParser.END_DOCUMENT)  {     
  5.     switch (eventCode){     
  6.         case XmlPullParser.START_DOCUMENT: //開始讀取XML文檔    
  7.         //實例化集合類    
  8.         break;     
  9.     case XmlPullParser.START_TAG://開始讀取某個標簽       
  10.         if("person".equals(parser.getName())) {     
  11.         //通過getName判斷讀到哪個標簽,然后通過nextText()獲取文本節點值,或通過getAttributeValue(i)獲取屬性節點值  
  12.         }     
  13.         break;  
  14.     case XmlPullParser.END_TAG://讀完一個Person,可以將其添加到集合類中  
  15.         break;  
  16.     }  
  17.     parser.next();  
  18. }  

PULL解析XML示例方法

 
Java方法
[java]  view plaincopy
 
  1. public static List<Person> readXML(InputStream inStream) {  
  2.     XmlPullParser parser = Xml.newPullParser();  
  3.     try {  
  4.         parser.setInput(inStream, "UTF-8");// 設置數據源編碼  
  5.         int eventType = parser.getEventType();// 獲取事件類型  
  6.         Person currentPerson = null;  
  7.         List<Person> persons = null;  
  8.         while (eventType != XmlPullParser.END_DOCUMENT) {  
  9.             switch (eventType) {  
  10.             case XmlPullParser.START_DOCUMENT:// 文檔開始事件,可以進行數據初始化處理  
  11.                 persons = new ArrayList<Person>();// 實例化集合類  
  12.                 break;  
  13.             case XmlPullParser.START_TAG://開始讀取某個標簽  
  14.                 //通過getName判斷讀到哪個標簽,然后通過nextText()獲取文本節點值,或通過getAttributeValue(i)獲取屬性節點值  
  15.                 String name = parser.getName();  
  16.                 if (name.equalsIgnoreCase("person")) {  
  17.                     currentPerson = new Person();  
  18.                     currentPerson.setId(new Integer(parser.getAttributeValue(null"id")));  
  19.                 } else if (currentPerson != null) {  
  20.                     if (name.equalsIgnoreCase("name")) {  
  21.                         currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值  
  22.                     } else if (name.equalsIgnoreCase("age")) {  
  23.                         currentPerson.setAge(new Short(parser.nextText()));  
  24.                     }  
  25.                 }  
  26.                 break;  
  27.             case XmlPullParser.END_TAG:// 結束元素事件  
  28.                 //讀完一個Person,可以將其添加到集合類中  
  29.                 if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {  
  30.                     persons.add(currentPerson);  
  31.                     currentPerson = null;  
  32.                 }  
  33.                 break;  
  34.             }  
  35.             eventType = parser.next();  
  36.         }  
  37.         inStream.close();  
  38.         return persons;  
  39.     } catch (Exception e) {  
  40.         e.printStackTrace();  
  41.     }  
  42.     return null;  
  43. }  

應用

XML文件
[html]  view plaincopy
 
  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>  
Activity文件
[java]  view plaincopy
 
  1. package com.app.data;  
  2.   
  3. import java.io.BufferedWriter;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileNotFoundException;  
  7. import java.io.FileOutputStream;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStreamWriter;  
  10. import java.net.HttpURLConnection;  
  11. import java.net.URL;  
  12. import java.util.ArrayList;  
  13. import java.util.HashMap;  
  14. import java.util.List;  
  15.   
  16. import org.xmlpull.v1.XmlPullParser;  
  17. import org.xmlpull.v1.XmlPullParserException;  
  18. import org.xmlpull.v1.XmlPullParserFactory;  
  19.   
  20. import com.app.other.Person;  
  21.   
  22. import android.app.Activity;  
  23. import android.os.Bundle;  
  24. import android.util.Xml;  
  25. import android.widget.TextView;  
  26.   
  27. public class XMLActivity extends Activity {  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         // TODO Auto-generated method stub  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_xml);  
  33.           
  34.         StringBuilder sBuilder = new StringBuilder();  
  35.         File xmlFile = new File("/mnt/sdcard/App/person.xml");  
  36.         try {  
  37.             FileInputStream inputStream = new FileInputStream(xmlFile);  
  38. //          URL url = new URL("http://10.0.2.2:8888/android/person.xml");  
  39. //          HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();  
  40. //          InputStream inputStream = urlConnection.getInputStream();  
  41.             List<Person> list = readXML(inputStream);  
  42.             for (int i = 0; i < list.size(); i++) {  
  43.                 Person person = list.get(i);  
  44.                 sBuilder.append("第-" + i + "-條記錄:\n");  
  45.                 sBuilder.append("getName--" + person.getName() + "\n");  
  46.                 sBuilder.append("getAge--" + person.getAge() + "\n");  
  47.                 sBuilder.append("getId--" + person.getId() + "\n");  
  48.             }  
  49.             inputStream.close();  
  50.         } catch (Exception e) {  
  51.             // TODO Auto-generated catch block  
  52.             e.printStackTrace();  
  53.         }  
  54.         TextView textView = (TextView)findViewById(R.id.textView2);  
  55.         textView.setText(sBuilder);  
  56.     }  
  57.   
  58.     public static List<Person> readXML(InputStream inStream) {  
  59.         XmlPullParser parser = Xml.newPullParser();  
  60.         try {  
  61.             parser.setInput(inStream, "UTF-8");// 設置數據源編碼  
  62.             int eventType = parser.getEventType();// 獲取事件類型  
  63.             Person currentPerson = null;  
  64.             List<Person> persons = null;  
  65.             while (eventType != XmlPullParser.END_DOCUMENT) {  
  66.                 switch (eventType) {  
  67.                 case XmlPullParser.START_DOCUMENT:// 文檔開始事件,可以進行數據初始化處理  
  68.                     persons = new ArrayList<Person>();// 實例化集合類  
  69.                     break;  
  70.                 case XmlPullParser.START_TAG://開始讀取某個標簽  
  71.                     //通過getName判斷讀到哪個標簽,然后通過nextText()獲取文本節點值,或通過getAttributeValue(i)獲取屬性節點值  
  72.                     String name = parser.getName();  
  73.                     if (name.equalsIgnoreCase("person")) {  
  74.                         currentPerson = new Person();  
  75.                         currentPerson.setId(new Integer(parser.getAttributeValue(null"id")));  
  76.                     } else if (currentPerson != null) {  
  77.                         if (name.equalsIgnoreCase("name")) {  
  78.                             currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值  
  79.                         } else if (name.equalsIgnoreCase("age")) {  
  80.                             currentPerson.setAge(new Short(parser.nextText()));  
  81.                         }  
  82.                     }  
  83.                     break;  
  84.                 case XmlPullParser.END_TAG:// 結束元素事件  
  85.                     //讀完一個Person,可以將其添加到集合類中  
  86.                     if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {  
  87.                         persons.add(currentPerson);  
  88.                         currentPerson = null;  
  89.                     }  
  90.                     break;  
  91.                 }  
  92.                 eventType = parser.next();  
  93.             }  
  94.             inStream.close();  
  95.             return persons;  
  96.         } catch (Exception e) {  
  97.             e.printStackTrace();  
  98.         }  
  99.         return null;  
  100.     }  
  101. }  
XML布局文件
[html]  view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     android:padding="15dp" >  
  7.   
  8.     <TextView  
  9.         android:id="@+id/textView1"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="XML文件讀取"  
  13.         android:layout_gravity="center_horizontal" />  
  14.   
  15.     <TextView  
  16.         android:id="@+id/textView2"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:text="TextView" />  
  20.   
  21. </LinearLayout>  
XML文件位置
 
 
 
執行結果:
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM