在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