安卓自帶了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 實體類
- package com.example.c;
- public class Book {
- private int id;
- private String name;
- private float price;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public float getPrice() {
- return price;
- }
- public void setPrice(float price) {
- this.price = price;
- }
- @Override
- public String toString() {
- return "id:" + id + ", name:" + name + ", price:" + price;
- }
- }
具體操作activity
- package com.example.c;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.TextView;
- public class XmlActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_xml);
- findViewById(R.id.write).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- List<Book> books = new ArrayList<Book>();
- for(int i=1; i<=20; i++) {
- Book book = new Book();
- book.setId(i);
- book.setName("我是第" + i + "個人");
- book.setPrice(i);
- books.add(book);
- }
- XmlUtils.createXml(XmlActivity.this, books);
- }
- });
- findViewById(R.id.read).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- InputStream is;
- try {
- is = new FileInputStream(new File(Environment.getExternalStorageDirectory() + "/abc.xml"));
- List<Book> books = XmlUtils.readXml(is);
- ((TextView)findViewById(R.id.visible)).setText(books.toString());
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- });
- }
- }
- package com.example.c;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlSerializer;
- import android.content.Context;
- import android.os.Environment;
- import android.util.Log;
- import android.util.Xml;
- public class XmlUtils {
- public static void createXml(Context context,List<Book> books) {
- // 判斷sdcard 是否存在
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- try {
- XmlSerializer xml = Xml.newSerializer();
- Log.d("ABC", Environment.getExternalStorageDirectory() +"") ;
- OutputStream os = new FileOutputStream(new File(Environment.getExternalStorageDirectory() + "/abc.xml"));
- xml.setOutput(os,"UTF-8");
- xml.startDocument("utf-8", true);
- xml.startTag("", "books");
- for(Book book:books) {
- xml.startTag("", "book");
- xml.attribute("", "id", book.getId() + "");
- xml.startTag("", "name");
- xml.text(book.getName());
- xml.endTag("", "name");
- xml.startTag("", "price");
- xml.text(book.getPrice() + "");
- xml.endTag("", "price");
- xml.endTag("", "book");
- }
- xml.endTag("", "books");
- xml.endDocument();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalStateException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //xml.
- }
- public static List<Book> readXml(InputStream is) {
- // TODO Auto-generated method stub
- List<Book> books = null;
- Book book = null;
- XmlPullParser parser = Xml.newPullParser();
- try {
- parser.setInput(is, "utf-8");
- int eventType = parser.getEventType();
- while(eventType != XmlPullParser.END_DOCUMENT) {
- switch(eventType) {
- case XmlPullParser.START_DOCUMENT:
- books = new ArrayList<Book>();
- break;
- case XmlPullParser.START_TAG:
- if(parser.getName().equals("book")) {
- book = new Book();
- } else if(parser.getName().equals("id")) {
- try {
- eventType = parser.next();
- book.setId(Integer.parseInt(parser.getText()));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } else if(parser.getName().equals("name")) {
- try {
- eventType = parser.next();
- book.setName(parser.getText());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } else if(parser.getName().equals("price")) {
- try {
- eventType = parser.next();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- book.setPrice(Float.parseFloat(parser.getText()));
- }
- break;
- case XmlPullParser.END_TAG:
- if(parser.getName().equals("book")) {
- books.add(book);
- book = null;
- }
- break;
- }
- try {
- eventType = parser.next();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return books;
- } catch (XmlPullParserException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- }
還有一點需要說的就是需要配置sdcard 讀取權限
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
界面佈局就很簡單了
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/write"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="生成" />
- <Button
- android:id="@+id/read"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="讀取" />
- <TextView
- android:id="@+id/visible"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
基本就可以實現讀寫了,需要更加複雜的自己去領悟吧