Android下Xml解析技术(三)、pull解析Xml文件

本文介绍Android中的Pull方式解析XML数据方法,通过示例详细解释了Pull解析器的基本使用流程,包括构建解析器、获取事件及处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。Pull解析xml项目是一个开源的项目,只不过android系统将它集中进去了。

官网:http://www.xmlpull.org

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()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。

下面看看pull技术具体如何解析xml文件。

依然是解析这个简单的文件:

 


 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <persons>

  3. <person id="1">

  4. <name>Lucy</name>

  5. <age>15</age>

  6. </person>

  7. <person id="2">

  8. <name>Tim</name>

  9. <age>20</age>

  10. </person>

  11. </persons>


解析代码:

 


 
  1. public void pullParseXml() throws XmlPullParserException, IOException {

  2. // 构建解析器

  3. XmlPullParser parser = Xml.newPullParser();

  4. // 获得xml文件的输入流,获得文档对象

  5. InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");

  6. parser.setInput(inputStream, "UTF-8");

  7.  
  8. //开始解析

  9. int eventType=parser.getEventType();//产生第一个事件

  10. List<Person> persons=null;

  11. Person person=null;

  12.  
  13. while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件 文档结束

  14. switch (eventType) {//判断事件的类型

  15. case XmlPullParser.START_DOCUMENT: //开始文档

  16. persons=new ArrayList<Person>();

  17. break;

  18. case XmlPullParser.START_TAG: //开始元素节点

  19. String name1=parser.getName();//获 取解析器当前指向元素节点的名称

  20. if("person".equals(name1)){//如果指向person节点

  21. person=new Person();

  22. person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值

  23. }else if ("name".equals(name1)) {

  24. person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值

  25. }else if ("age".equals(name1)) {

  26. person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值

  27. }

  28. break;

  29. case XmlPullParser.END_TAG://结束元素节点

  30. String name2=parser.getName();

  31. if("person".equals(name2)){//如果指向/person节点

  32. persons.add(person);

  33. person=null;

  34. }

  35. break;

  36. }

  37. eventType=parser.next();//解析器向下移动一个单位

  38. }

  39. for (Person p : persons) {

  40. System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());

  41. }

  42. }

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值