Android自學筆記-9-Pull方式處理XML

在android中處理XML可以使用三種方式:DOM、SAX、PUll,這裡我隻是簡單介紹Pull方式,其他的兩個方式可以自己去找找資料。

Pull方式在我理解跟SAX原理差不多,都是不會將整個XML一次加載,而是從頭開始一部分一部分的加載,然後通過一些事件判斷節點,比如會有文檔開始/結束事件、標簽開始/結束事件等,通過判斷事件的類型及內容能夠確定當前到達的XML節點,然後構造數據。下面給出一個簡單的例子,在例子中隻是使用瞭START_TAG事件:

package com.mxy.pull;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import com.mxy.MainActivity;

import android.util.Log;
import android.util.Xml;

public class PullParseXml {
    
    
    public void PullParseXML(){
        
        
        XmlPullParser parser = Xml.newPullParser();
        InputStream ins = MainActivity.class.getClassLoader().getResourceAsStream("data.xml");
		try {
			parser.setInput(ins, "utf-8");
			
			int type = parser.getEventType();
			//設置到文檔結束的時候,退出循環
			while(type != XmlPullParser.END_DOCUMENT){
				String name = null;
				String id = null;
				switch (type) {
				case XmlPullParser.START_TAG:
					if("student".equals(parser.getName())){
						id = parser.getAttributeValue(0);
						Log.i("mxy", "student id=" + id);
					}else if("name".equals(parser.getName())){
						name = parser.nextText();
						Log.i("mxy", "name=" + name);
					}
					break;
				case XmlPullParser.END_TAG:
					//處理TAG結束事件
					break;
				case XmlPullParser.TEXT:
					break;
				//還有其他的事件
				default:
					break;
				}
				
				//這句很重要,將當前的節點類型設置為下一個,以便進入下次循環
				type = parser.next();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
}

下面簡單介紹一下構造一個XML文件,最簡單的就是我們可以使用字符串去拼接一段XML,這種方式最簡單最易理解,但是有一點很容發生錯誤。所以我們可以使用XmlSerializer來構造一個XML數據。

下面給出一個小例子,是生成一段簡單的XML,並將其保存到外部SD卡上:

/**
     * Xml序列話
     * 1 直接拼字符串
     * 2 使用XmlSerializer進行序列話
     */
	private void xmlSerializerMethod() {
		XmlSerializer serializer = Xml.newSerializer();
        File file = new File(Environment.getExternalStorageDirectory(),"backup.xml");
        //這裡獲取的地址是/storage/sdcard/
        Log.i("mxy",Environment.getExternalStorageDirectory().toString());
        try {
        	//需要給serializer設置一個Output否則我們序列化的xml,無法取出
        	StringWriter writer = new StringWriter();  
            serializer.setOutput(writer); 
        	
			FileOutputStream fos = new FileOutputStream(file);
			serializer.startDocument("utf-8", true);
			
			serializer.setOutput(fos, "utf-8");
			serializer.startTag(null, "sms");
			
			serializer.startTag(null, "name");
			serializer.attribute(null, "id", "1");
			
			serializer.text("你好");
			
			serializer.endTag(null, "name");
			
			serializer.endTag(null, "sms");
			serializer.endDocument();
			
			//將數據寫入到文件中
			fos.write(writer.toString().getBytes());
			
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

可能我寫的不是很清楚,如果想進一步瞭解可以參看https://blog.csdn.net/liuhe688/article/details/6415593。

例子工程下載地址:https://download.csdn.net/detail/mengxiangyue/7020131

轉載請註明出處:https://blog.csdn.net/mengxiangyu

發佈留言