在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();
}
}
可能我写的不是很清楚,如果想进一步了解可以参看http://blog.csdn.net/liuhe688/article/details/6415593。
例子工程下载地址:http://download.csdn.net/detail/mengxiangyue/7020131
转载请注明出处:http://blog.csdn.net/mengxiangyu
Android自学笔记-9-Pull方式处理XML,布布扣,bubuko.com
原文:http://blog.csdn.net/mengxiangyue/article/details/20957739