Android中操作XML——使用Pull解析XML
分类:Android, Java
阅读 (2,478)
Add comments
12月 252012
Pull也是一个轻量级的解析xml的类,类似sax,边取边读,占用内存小,避免让app产生oom的问题。
解析使用的类为XmlPullParser,XmlPullParser分节点读取,每到节点的开始或者结尾时会触发相应的事件(event),开发人员可以在这些事件中处理数据,常用到的事件有:START_DOCUMENT、END_DOCUMENT、START_TAG、END_TAG。
Pull方式和sax的区别如下:
1. Pull的解析放在一个函数中就可以了,而sax必须新建一个Handler类来处理xml.
2. 正因为sax需要一个Handler来处理事件,它本身无法控制何时停止解析,而Pull在不需要后面数据的时候可以停止事件处理,退出解析
下面是一个测试xml文件:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <UserList> <User Name="Liu" ID="1"> <Website><![CDATA[http://svn1.bcoder.com ]]></Website> <Intro>I come from hebei.</Intro> </User> <User Name="Zhang" ID="2"> <Website><![CDATA[http://www.desktoptool.net]]></Website> <Intro>I come from Shandong.</Intro> </User> </UserList> |
下面是使用XmlPullParser解析xml的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public void ParseFromPull(View v) throws Exception{ EditText etXmlValues = (EditText)findViewById(R.id.editText1); etXmlValues.setText(""); XmlPullParser parser = Xml.newPullParser(); parser.setInput(getResources().openRawResource(R.raw.sample_xml), "UTF-8"); int event = parser.getEventType(); while(event != XmlPullParser.END_DOCUMENT){ switch (event) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: // User节点开始 if("User".equals(parser.getName())){ // 获取User节点的ID属性 etXmlValues.append("ID: " + parser.getAttributeValue(null, "ID")); etXmlValues.append("\r\n"); etXmlValues.append("Name: " + parser.getAttributeValue(null, "Name")); etXmlValues.append("\r\n"); } else if("Website".equals(parser.getName())){ // 获取Website节点的文本内容 etXmlValues.append("Website: " + parser.nextText()); etXmlValues.append("\r\n"); } else if("Intro".equals(parser.getName())){ etXmlValues.append("Intro: " + parser.nextText()); etXmlValues.append("\r\n"); } break; case XmlPullParser.END_TAG: // User节点结束 if("User".equals(parser.getName())){ etXmlValues.append("\r\n"); } break; default: break; } try { event = parser.next(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |