安卓xml pull 解析

安卓自帶了pull 來解析xml 文件,採用面向對象編程使用起來很方便,如果在代碼中自己拼接,後期在標籤中加入新的屬性很麻煩的所以採用面向對象方式來進行編寫纔是正道,我並沒有研究過pull 源碼,我的建議是它有一個setText 方法 如果屬性是基本類型來要自己轉,有興趣的大家可以研究下



PULL解析器的運行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產生的事件然後做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的代碼。PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統內部在解析各種XML時也是用PULL解析器。

關於 pull sax dom 的具體解析方式大家參考 :http://blog.csdn.net/liuhe688/article/details/6415593 寫的不錯


我實現了一個把數據放入sdcard 存儲,進行讀取的一個demo 大家可以參考一下


book 實體類

[java] view plaincopy
  1. package com.example.c;  
  2.   
  3. public class Book {  
  4.   
  5.     private int id;    
  6.     private String name;    
  7.     private float price;    
  8.         
  9.     public int getId() {    
  10.         return id;    
  11.     }    
  12.     
  13.     public void setId(int id) {    
  14.         this.id = id;    
  15.     }    
  16.     
  17.     public String getName() {    
  18.         return name;    
  19.     }    
  20.     
  21.     public void setName(String name) {    
  22.         this.name = name;    
  23.     }    
  24.     
  25.     public float getPrice() {    
  26.         return price;    
  27.     }    
  28.     
  29.     public void setPrice(float price) {    
  30.         this.price = price;    
  31.     }    
  32.     
  33.     @Override    
  34.     public String toString() {    
  35.         return "id:" + id + ", name:" + name + ", price:" + price;    
  36.     }    
  37. }  

具體操作activity

[java] view plaincopy
  1. package com.example.c;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.InputStream;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import android.app.Activity;  
  11. import android.os.Bundle;  
  12. import android.os.Environment;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.TextView;  
  16.   
  17. public class XmlActivity  extends Activity {  
  18.   
  19.     @Override  
  20.     protected void onCreate(Bundle savedInstanceState) {  
  21.         // TODO Auto-generated method stub  
  22.         super.onCreate(savedInstanceState);  
  23.           
  24.         setContentView(R.layout.activity_xml);  
  25.           
  26.         findViewById(R.id.write).setOnClickListener(new OnClickListener() {  
  27.               
  28.             @Override  
  29.             public void onClick(View v) {  
  30.                 // TODO Auto-generated method stub  
  31.                 List<Book> books = new ArrayList<Book>();  
  32.                   
  33.                 for(int i=1; i<=20; i++) {  
  34.                     Book book = new Book();  
  35.                     book.setId(i);  
  36.                     book.setName("我是第" + i + "個人");  
  37.                     book.setPrice(i);  
  38.                       
  39.                     books.add(book);  
  40.                 }  
  41.                   
  42.                 XmlUtils.createXml(XmlActivity.this, books);  
  43.             }  
  44.         });  
  45.           
  46.         findViewById(R.id.read).setOnClickListener(new OnClickListener() {  
  47.               
  48.             @Override  
  49.             public void onClick(View v) {  
  50.                 // TODO Auto-generated method stub  
  51.                 InputStream is;  
  52.                 try {  
  53.                     is = new FileInputStream(new File(Environment.getExternalStorageDirectory() + "/abc.xml"));  
  54.                     List<Book> books = XmlUtils.readXml(is);  
  55.                       
  56.                     ((TextView)findViewById(R.id.visible)).setText(books.toString());  
  57.                 } catch (FileNotFoundException e) {  
  58.                     // TODO Auto-generated catch block  
  59.                     e.printStackTrace();  
  60.                 }  
  61.                   
  62.             }  
  63.         });  
  64.     }  
  65. }  


xml 的具體讀取
[html] view plaincopy
  1. package com.example.c;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.util.ArrayList;  
  10. import java.util.List;  
  11.   
  12. import org.xmlpull.v1.XmlPullParser;  
  13. import org.xmlpull.v1.XmlPullParserException;  
  14. import org.xmlpull.v1.XmlSerializer;  
  15.   
  16. import android.content.Context;  
  17. import android.os.Environment;  
  18. import android.util.Log;  
  19. import android.util.Xml;  
  20.   
  21. public class XmlUtils {  
  22.   
  23.     public static void createXml(Context context,List<Book> books) {  
  24.         // 判斷sdcard 是否存在  
  25.         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
  26.             try {  
  27.                 XmlSerializer xml =  Xml.newSerializer();  
  28.                   
  29.                 Log.d("ABC", Environment.getExternalStorageDirectory() +"") ;  
  30.                   
  31.                 OutputStream os = new FileOutputStream(new File(Environment.getExternalStorageDirectory() + "/abc.xml"));  
  32.                   
  33.                 xml.setOutput(os,"UTF-8");  
  34.                 xml.startDocument("utf-8", true);  
  35.                   
  36.                 xml.startTag("", "books");  
  37.                   
  38.                 for(Book book:books) {  
  39.                     xml.startTag("", "book");  
  40.                     xml.attribute("", "id", book.getId() + "");  
  41.                       
  42.                     xml.startTag("", "name");  
  43.                     xml.text(book.getName());  
  44.                     xml.endTag("", "name");  
  45.                       
  46.                     xml.startTag("", "price");  
  47.                     xml.text(book.getPrice() + "");  
  48.                     xml.endTag("", "price");  
  49.                       
  50.                     xml.endTag("", "book");  
  51.                 }  
  52.                 xml.endTag("", "books");  
  53.                 xml.endDocument();  
  54.                   
  55.             } catch (FileNotFoundException e) {  
  56.                 // TODO Auto-generated catch block  
  57.                 e.printStackTrace();  
  58.             } catch (IllegalArgumentException e) {  
  59.                 // TODO Auto-generated catch block  
  60.                 e.printStackTrace();  
  61.             } catch (IllegalStateException e) {  
  62.                 // TODO Auto-generated catch block  
  63.                 e.printStackTrace();  
  64.             } catch (IOException e) {  
  65.                 // TODO Auto-generated catch block  
  66.                 e.printStackTrace();  
  67.             }  
  68.         }  
  69.       
  70.         //xml.  
  71.     }  
  72.   
  73.     public static List<Book> readXml(InputStream is) {  
  74.         // TODO Auto-generated method stub  
  75.           
  76.         List<Book> books = null;  
  77.         Book book = null;  
  78.           
  79.         XmlPullParser parser = Xml.newPullParser();  
  80.         try {  
  81.             parser.setInput(is, "utf-8");  
  82.               
  83.             int eventType = parser.getEventType();  
  84.               
  85.             while(eventType != XmlPullParser.END_DOCUMENT) {  
  86.                 switch(eventType) {  
  87.                 case XmlPullParser.START_DOCUMENT:  
  88.                     books = new ArrayList<Book>();  
  89.                     break;  
  90.                 case XmlPullParser.START_TAG:  
  91.                     if(parser.getName().equals("book")) {  
  92.                         book = new Book();  
  93.                           
  94.                     } else if(parser.getName().equals("id")) {  
  95.                         try {  
  96.                             eventType = parser.next();  
  97.                             book.setId(Integer.parseInt(parser.getText()));  
  98.                         } catch (IOException e) {  
  99.                             // TODO Auto-generated catch block  
  100.                             e.printStackTrace();  
  101.                         }  
  102.                           
  103.                     } else if(parser.getName().equals("name")) {  
  104.                         try {  
  105.                             eventType = parser.next();  
  106.                             book.setName(parser.getText());  
  107.                         } catch (IOException e) {  
  108.                             // TODO Auto-generated catch block  
  109.                             e.printStackTrace();  
  110.                         }  
  111.                     } else if(parser.getName().equals("price")) {  
  112.                         try {  
  113.                             eventType = parser.next();  
  114.                         } catch (IOException e) {  
  115.                             // TODO Auto-generated catch block  
  116.                             e.printStackTrace();  
  117.                         }  
  118.                         book.setPrice(Float.parseFloat(parser.getText()));  
  119.                     }  
  120.                     break;  
  121.                 case XmlPullParser.END_TAG:  
  122.                     if(parser.getName().equals("book")) {  
  123.                         books.add(book);  
  124.                         book = null;  
  125.                     }  
  126.                     break;  
  127.                 }  
  128.                 try {  
  129.                     eventType = parser.next();  
  130.                 } catch (IOException e) {  
  131.                     // TODO Auto-generated catch block  
  132.                     e.printStackTrace();  
  133.                 }  
  134.             }  
  135.             return books;  
  136.         } catch (XmlPullParserException e) {  
  137.             // TODO Auto-generated catch block  
  138.             e.printStackTrace();  
  139.         }  
  140.         return null;  
  141.     }  
  142. }  

還有一點需要說的就是需要配置sdcard 讀取權限

[html] view plaincopy
  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  

界面佈局就很簡單了

[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.   
  7.     <Button  
  8.         android:id="@+id/write"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="生成" />  
  12.   
  13.     <Button  
  14.         android:id="@+id/read"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:text="讀取" />  
  18.   
  19.     <TextView  
  20.         android:id="@+id/visible"  
  21.         android:layout_width="match_parent"  
  22.         android:layout_height="wrap_content" />  
  23.   
  24. </LinearLayout>  


基本就可以實現讀寫了,需要更加複雜的自己去領悟吧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章