Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
来源:互联网 发布:logo字体发表软件 编辑:程序博客网 时间:2024/05/22 14:15
一、Pull解析介绍:
Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较合适的XML解析方式。但是SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。
Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件(开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等),但需要调用next() 方法提取它们(主动提取事件)。
Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创建XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。
二、准备xml文件:
文件保存在src目录下
<?xml version="1.0" encoding="UTF-8"?><persons> <person id="1001"> <name>张三</name> <age>27</age> </person> <person id="1002"> <name>李四</name> <age>25</age> </person> <person id="1003"> <name>王五</name> <age>28</age> </person> <person id="1004"> <name>赵六</name> <age>30</age> </person></persons>
三、通过Pull解析和保存实现:
package com.example.service;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.XmlSerializer;import android.util.Xml;import com.example.entity.Person;public class XMLParse { /** * 解析xml * @param in 输入流 * @return */ public List<Person> parse(InputStream in) { List<Person> persons=null; Person person=null; try { //创建XmlPullParser,有两种方式 //方式一:使用工厂类XmlPullParserFactory // XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance(); // XmlPullParser xmlPullParser = pullFactory.newPullParser(); // //方式二:使用Android提供的实用工具类android.util.Xml XmlPullParser xmlPullParser = Xml.newPullParser(); xmlPullParser.setInput(in, "UTF-8"); int event = xmlPullParser.getEventType(); boolean isDone = false; //具体解析xml while ((event != XmlPullParser.END_DOCUMENT)&&(isDone != true)) { switch (event) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if("person".equals(xmlPullParser.getName())){ person = new Person(); int id = Integer.valueOf(xmlPullParser.getAttributeValue(0)); person.setId(id); } if("name".equals(xmlPullParser.getName())){ person.setName(xmlPullParser.nextText()); } if("age".equals(xmlPullParser.getName())){ person.setAge(Integer.valueOf(xmlPullParser.nextText())); } break; case XmlPullParser.END_TAG: if("person".equals(xmlPullParser.getName())){ persons.add(person); person=null; } break; } //调用next()方法主动提取事件 event = xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } return persons; } /** * 将对象保存成xml文件 * @param out * @param persons */ public void save(OutputStream out,List<Person> persons){ try { XmlSerializer xml = Xml.newSerializer(); xml.setOutput(out, "UTF-8"); xml.startDocument("UTF-8", true); xml.startTag(null, "persons"); for (Person person : persons) { xml.startTag(null, "person"); //设置属性 xml.attribute(null, "id", person.getId().toString()); xml.startTag(null, "name"); xml.text(person.getName());//设置内容 xml.endTag(null, "name"); xml.startTag(null, "age"); xml.text(person.getAge().toString()); xml.endTag(null, "age"); xml.endTag(null, "person"); } xml.endTag(null, "persons"); xml.endDocument(); out.flush();//防止是缓冲流 out.close(); } catch (Exception e) { e.printStackTrace(); } }}
四、测试与结果:
package com.example.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import android.test.AndroidTestCase;import android.util.Log;import com.example.entity.Person;import com.example.service.XMLParse;public class XMLParseTest extends AndroidTestCase { private static String TAG ="XMLParseTest"; public void testParse() { XMLParse p = new XMLParse(); //Person.xml文件在src目录下 InputStream in = XMLParseTest.class.getClassLoader().getResourceAsStream("Person.xml"); List<Person> persons = p.parse(in); for (Person person : persons) { Log.i(TAG, person.toString()); } } public void testSave() { try { XMLParse p = new XMLParse(); List<Person> persons=new ArrayList<Person>(); persons.add(new Person(10001,"tom",25)); persons.add(new Person(10002,"lily",26)); persons.add(new Person(10003,"xiaoming",27)); //将文件保存在当前应用所在包的files文件夹下 FileOutputStream fos=new FileOutputStream(new File(getContext().getFilesDir(),"xiaoming.xml")); p.save(fos, persons); } catch (Exception e) { e.printStackTrace(); } }}
将对象生成xml文件及保存位置:
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><persons> <person id="10001"> <name>tom</name> <age>25</age> </person> <person id="10002"> <name>lily</name> <age>26</age> </person> <person id="10003"> <name>xiaoming</name> <age>27</age> </person> </persons>
结果(在LogCat中加入XMLParseTest标签):
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
- Android 使用SAX或者DOM或者pull解析XML文件
- Android 使用SAX或者DOM或者pull解析XML文件
- 使用SAX或者DOM或者pull解析XML文件
- 使用SAX或者DOM或者pull解析XML文件
- Android:使用SAX或者DOM或者pull操作XML文件
- 使用SAX或者DOM或者pull读取XML文件
- 使用SAX或者DOM或者pull解析XML文件的使用
- 使用SAX或者DOM解析XML文件
- android中使用SAX, DOM, 或者pull 来解析XML文档
- Android xml文件解析 SAX,DOM,PULL
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- Android 中利用SAX ,Dom,pull解析 XML 文件
- android中解析XML文件方式—DOM SAX PULL
- Android 利用DOM,SAX,PULL解析xml文件
- Dom、Sax、Pull解析xml文件
- XML文件解析汇总SAX/DOM/PULL
- javascript操作Date对象
- css块元素的 display 属性 inline-block 的应用
- javascript ActiveXObject FileSystemObject 对象,创建、复制、删除、读取文件等
- java GZIP 压缩数据
- Android学习笔记_6_保存文件到SDCard
- Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件
- Android学习笔记_8_使用SharedPreferences存储数据
- Android学习笔记_9_SQLiteOpenHelper对象之数据库增删改查以及事务回滚操作
- 区间选点问题(贪心)
- Android学习笔记_10_ContentProvider内容提供者的使用
- Android学习笔记_11_ListView控件使用
- Android学习笔记_12_网络通信之从web获取资源数据到Android
- Android学习笔记_13_网络通信之多个上传文件
- Android学习笔记_14_对JSON格式数据的处理