Android开发进阶(二)--XML文件解析之PULL模式解析
2011-11-10 10:45
555 查看
Pull模式解析原理:
与SAX解析器模拟相似,也提供了类似的事件驱动.使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull模式解析步骤:
1、 得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:
1)通过Xml这个工具类的.newPullParser()方式得到
2)通过XmlPullParserFactory工厂创建
//得到XmlPullParserFacotry工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xmlparser = factory.newPullParser();
2、 再根据XmlPullParser对象设置输入流和编码格式
parser.setInput(inputStream, "UTF-8");
3、 然后循环遍历所有的结点可以通过文档开始的代码来判断读入到哪个节点
关于xmlparser.getEventType()其值有:
Start_DOCUMENT:文档开始
END_DOCUMENT:文档结束
START_TAG:开始读标签
END_TAG:标签结束
TEXT:所读的是文本内容
一个简单示例:
import java.io.IOException; import java.io.StringReader; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; public class SimpleXmlPullApp{ public static void main (String args[]) throws XmlPullParserException, IOException{ XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) ); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if(eventType == XmlPullParser.START_DOCUMENT) { System.out.println("Start document"); } else if(eventType == XmlPullParser.START_TAG) { System.out.println("Start tag "+xpp.getName()); } else if(eventType == XmlPullParser.END_TAG) { System.out.println("End tag "+xpp.getName()); } else if(eventType == XmlPullParser.TEXT) { System.out.println("Text "+xpp.getText()); } eventType = xpp.next(); } System.out.println("End document"); } }
输出结果:
Start document
Start tag foo
Text Hello World!
End tag foo
还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里
person.xml:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <person id="20"> <name>李向梅</name> <age>25</age> </person> </persons>
Person类:
public class Person { private Integer id; private String name; private short age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public short getAge() { return age; } public void setAge(short age) { this.age = age; } @Override public String toString() { return "Person [age=" + age + ", id=" + id + ", name=" + name + "]"; } }
业务bean
public static List<Person> readXml(InputStream inputStream)
throws Exception {
List<Person> persons=null;
// XMLPullParser对象
XmlPullParser parser = Xml.newPullParser();
//设置输入流和编码
parser.setInput(inputStream, "UTF-8");// 文件开始代码
int eventCode = parser.getEventType();
Person person = null;
while (eventCode != XmlPullParser.END_DOCUMENT) {
switch (eventCode) {
//文档开始
case XmlPullParser.START_DOCUMENT:
// 初始化
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //开始标签
if ("person".equals(parser.getName())) {
person = new Person();
person.setId(Integer.parseInt(parser.getAttributeValue(0)));
}
else if(person!=null){
if ("name".equals(parser.getName())) {
//nextNext()如果下一个元素的内容是文本的时候适合用
person.setName(parser.nextText());
}
else if("age".equals(parser.getName())){
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG://结束标签
if ("person".equals(parser.getName()) && person!=null) {
persons.add(person);
person=null;//再掷为null
}
break;
}
// 下一个节点
eventCode = parser.next();
}
return persons;
}
测试:
public class SAXPersonServiceTest extends AndroidTestCase { private static final String TAG = "LogTest"; //PULL方式 public void testPULLReadXml() throws Exception { System.out.println("testPULLReadXml"); InputStream inputStream = SAXPersonServiceTest.class.getClassLoader() .getResourceAsStream("person.xml"); List<Person> list = PULLPersonService.readXml(inputStream); System.out.println(list.size()); for (Person person : list) { System.out.println(person); } } } 如需转载引用请注明出处:http://blog.csdn.net/jiahui524
相关文章推荐
- Android开发进阶(一)XML文件解析之SAX模式解析
- Android开发进阶(六)--PULL模式解析XML文件
- Android开发进阶(六)--原始XML文件的使用以及PULL解析小例
- 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)
- Android开发之使用pull解析xml文件
- Android--XML文件解析之PULL模式解析
- android应用开发之利用SAX、DOM和Pull实现对XML文件的解析并进行单元测试
- Android开发学习---使用XmlPullParser解析xml文件
- Android开发进阶(五)----------SAX模式解析XML文件
- Android 开发学习心得(一)。pull解析xml文件_天气预报
- Android 开发 pull解析器解析xml文件
- Android开发--XML文件的解析的三种方法
- Android开发:XML简介及DOM、SAX、PULL解析对比
- Android -- 创建XML文件对象及其序列化, pull解析XML文件
- <<Android源码设计模式解析与实战>>读书笔记----- Android NDK开发学习
- Android使用pull方法解析XML文件
- Android中的XML解析与生成——Pull解析xml、实现xml文件的生成
- [120_移动开发Android]008_android开发之Pull操作xml文件
- Android开发使用Dom从网络端解析xml文件
- Android开发中常用的设计模式初步解析