当前位置: 首页 > 编程日记 > 正文

Android XML pull 解析器

Android 并未提供对 Java StAX API 的支持。但是,Android 确实附带了一个 pull 解析器,其工作方式类似于 StAX。它允许您的应用程序代码从解析器中获取事件,这与 SAX 解析器自动将事件推入处理程序相反。清单 10 显示了提要解析接口的一个 pull 解析器实现。
清单 10. 基于 Pull 解析器的实现
				
public class XmlPullFeedParser extends BaseFeedParser {public XmlPullFeedParser(String feedUrl) {super(feedUrl);}public List<Message> parse() {List<Message> messages = null;XmlPullParser parser = Xml.newPullParser();try {// auto-detect the encoding from the streamparser.setInput(this.getInputStream(), null);int eventType = parser.getEventType();Message currentMessage = null;boolean done = false;while (eventType != XmlPullParser.END_DOCUMENT && !done){String name = null;switch (eventType){case XmlPullParser.START_DOCUMENT:messages = new ArrayList<Message>();break;case XmlPullParser.START_TAG:name = parser.getName();if (name.equalsIgnoreCase(ITEM)){currentMessage = new Message();} else if (currentMessage != null){if (name.equalsIgnoreCase(LINK)){currentMessage.setLink(parser.nextText());} else if (name.equalsIgnoreCase(DESCRIPTION)){currentMessage.setDescription(parser.nextText());} else if (name.equalsIgnoreCase(PUB_DATE)){currentMessage.setDate(parser.nextText());} else if (name.equalsIgnoreCase(TITLE)){currentMessage.setTitle(parser.nextText());}    }break;case XmlPullParser.END_TAG:name = parser.getName();if (name.equalsIgnoreCase(ITEM) && 
currentMessage != null){messages.add(currentMessage);} else if (name.equalsIgnoreCase(CHANNEL)){done = true;}break;}eventType = parser.next();}} catch (Exception e) {throw new RuntimeException(e);}return messages;}
}

pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件(开始元素和结束元素),但您需要使用 (parser.next() 提取它们。事件将作为数值代码被发送,因此您可以使用一个简单 case-switch。注意,解析并未像 SAX 解析那样监听元素的结束,而是在开始处完成了大部分处理。在 清单 10 的代码中,当某个元素开始时,您可以调用 parser.nextText() 从 XML 文档中提取所有字符数据。还需注意,您设置了一个标记(布尔变量 done)来确定何时到达感兴趣内容的结束部分。这允许您提早停止读取 XML 文档,因为您知道代码将不会关心文档的其余部分。这有时非常实用,特别是当您只需要访问一小部分 XML 文档时。通过尽快停止解析,您可以极大地减少解析时间。这种优化对于连接速度较慢的移动设备尤为重要。pull 解析器可以提供一些性能优势以及易用性。它还可以用于编写 XML。


创建 XML

目前为止,我一直专注于通过 Internet 解析 XML。但是,有时您的应用程序可能需要将 XML 发送到远程服务器。显然,您可以只使用一个 StringBuilder 来创建 XML 字符串。另一种备选方法来自 清单 11 中的 Pull 解析器。


清单 11. 使用 pull 解析器编写 XML
				
private String writeXml(List<Message> messages){XmlSerializer serializer = Xml.newSerializer();StringWriter writer = new StringWriter();try {serializer.setOutput(writer);serializer.startDocument("UTF-8", true);serializer.startTag("", "messages");serializer.attribute("", "number", String.valueOf(messages.size()));for (Message msg: messages){serializer.startTag("", "message");serializer.attribute("", "date", msg.getDate());serializer.startTag("", "title");serializer.text(msg.getTitle());serializer.endTag("", "title");serializer.startTag("", "url");serializer.text(msg.getLink().toExternalForm());serializer.endTag("", "url");serializer.startTag("", "body");serializer.text(msg.getDescription());serializer.endTag("", "body");serializer.endTag("", "message");}serializer.endTag("", "messages");serializer.endDocument();return writer.toString();} catch (Exception e) {throw new RuntimeException(e);} 
}

XmlSerializer 类是 前一部分 所使用的 XmlPullParser 包的一部分。它没有提取事件,而是将它们推出到数据流或编写程序中。在本例中,它仅仅将事件推送到了一个 java.io.StringWriter 实例中。它提供了一个直观的 API,通过各种方法开始和结束文档、处理元素以及添加文本或属性。这是 StringBuilder 的一种出色的替换方案,因为它可以更加轻松地确保您的 XML 具有良好结构。


结束语

您希望为 Android 设备构建何种类型的应用程序?无论如何,如果它需要通过 Internet 使用数据,那么都可能需要使用 XML。在本文中,您看到 Android 提供了大量用于处理 XML 的工具。您可以选择其中之一作为自己的工具,或者您可以根据用例来进行选择。大多数时间,使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。如果您的文档比较小,那么 DOM 可能是一种比较简单的方法。如果您的文档比较大,但您只需要文档的一部分,则 XML Pull 解析器可能是更为有效的方法。最后,对于编写 XML,Pull 解析器包也提供了一种便捷的方法。因此,无论您的 XML 需求如何,Android 都能在一定程度上满足它们。



下载

名字大小下载方法
AndroidXml.zip70KBHTTP

关于下载方法的信息


参考资料

学习

  • 用 Eclipse 开发 Android 应用程序(Frank Ableson,developerWorks,2008 年 2 月):开发 Android 应用程序最简单的方法是使用 Eclipse。在本教程中了解这方面的所有信息。

  • Geronimo 叛逆者:使用集成软件包:Codehaus 的 Woodstox(Michael Galpin,developerWorks,2007 年 7 月):有关 SAX、DOM 和 pull 解析的比较,请阅读本文。

  • 使用 StAX 解析 XML,第 2 部分: 拉式解析和事件(Peter Nehrer,developerWorks,2006 年 12 月):深入了解 XML pull 解析。

  • 理解 SAX(Nicholas Chase,developerWorks,2003 年 7 月):阅读本教程,成为 SAX 解析方面的专家。

  • 理解 DOM(Nicholas Chase,developerWorks,2007 年 3 月):有关 DOM 解析的更多信息,请阅读本教程。

  • Android SDK 文档:了解这款用于开发和调试应用程序代码以及设计应用程序的工具。

  • Open Handset Alliance 是一个由 47 家技术和移动公司组成的组织,这些公司共同致力于加快移动领域的创新。

  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。

  • XML 技术库:developerWorks XML 专区提供了大量技术文章和技巧、教程、标准以及 IBM 红皮书。

  • developerWorks 技术活动网络广播:随时关注技术的最新进展。

  • developerWorks 播客:收听一些与软件开发人员有关的有趣访谈和讨论。

获得产品和技术

  • Android SDK:下载它并访问 API 参考指南,从官方 Android 开发人员站点获取关于 Android 的最新消息。

  • Android Open Source Project:获取 Android 开源代码。

  • Eclipse IDE:获取最新版本并开始使用它。

  • IBM 产品评估试用版软件:下载或 在 IBM SOA Sandbox 中进行在线试用 并获得来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

讨论

  • 参与论坛讨论

  • XML 专区讨论论坛:参与任何面向 XML 的论坛。

  • developerWorks 博客:阅读这些博客并参与 developerWorks 社区

关于作者

Michael Galpin 是 eBay 的一名架构师。他经常为 developerWorks 撰写文章,同时在 TheServerSide.com 和 Java Developer 期刊上发表文章,他还有自己的 博客。他从 1998 年开始做职业程序员,并拥有加州理工学院数学专业的学士学位。

转载于:https://www.cnblogs.com/bmate/archive/2011/01/24/1943208.html

相关文章:

Zepto.js库touch模块代码解析

Zepto.js也许并不陌生&#xff0c;专门针对移动端开发&#xff0c;Zepto有一些基本的触摸事件可以用来做触摸屏交互&#xff08;tap事件、swipe事件&#xff09;&#xff0c;Zepto是不支持IE浏览器的。 下面来解析一些Zepto.js触摸事件的解析&#xff1a; 1.触摸事件离不开:tou…

PHP 常用字符串处理代码片段

移除 HTML 标签 $text strip_tags($input, ""); 返回 $start 和 $end 之间的文本function GetBetween($content,$start,$end){ $r explode($start, $content); if (isset($r[1])){ $r explode($end, $r[1]); return $r[0]; } ret…

【maven】初识maven

一&#xff1a;maven的配置&#xff1a; 集成到eclipse步骤&#xff1a; 1、下载maven&#xff0c;放到软件安装目录&#xff0c;打开目录&#xff1a;MAVEN_HOME/conf/ 2、修改文件setting.xml&#xff1a;仓库配置目录&#xff1a;<localRepository>D:\DATA\lo…

[C++再学习系列] 函数模板和类模板

函数模板和类模板 C 提供类模板和函数模板。函数模板允许重载 &#xff0c;而类模板不允许重载(类无重载概念)。类模板可以进行全特化和偏特化&#xff0c;而函数模板仅能够全特化 。因此&#xff0c;写一个看似函数模板偏特化的函数模板实际上是在写一个单独的主函数模板&…

git init 与 git init --bare 区别

git init 与 git init --bare 区别 发现问题 最早是在公司的wiki上发现了这个命令&#xff0c;google后发现值得记录下来 实践中发现的区别 网上找了很多资料&#xff0c;但说的很乱&#xff0c;干脆在自己的服务器上执行对比了一下&#xff1a;git init demo1 # 表示创建一个…

一个虚函数和虚继承的问题。

这个问题困惑好几天了。废话不多说&#xff0c;先上代码。 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 virtual void aa() 8 { 9 } 10 private: 11 char k[3]; 12 }; 13 14 class B:publi…

Linux性能分析命令工具汇总

转自&#xff1a;http://rdc.hundsun.com/portal/article/731.html?refmyread出于对Linux操作系统的兴趣&#xff0c;以及对底层知识的强烈欲望&#xff0c;因此整理了这篇文章。本文也可以作为检验基础知识的指标&#xff0c;另外文章涵盖了一个系统的方方面面。如果没有完善…

【jsp】使用get方法传值的格式

get:通过地址提交 格式&#xff1a; http://192.168.7.45:7002/jsp29/doAddStu.jsp?stuNo20181013123&stuName%E5%B0%8F%E5%BC%BA&gender0&age19&major%E7%94%B5%E5%AD%90%E5%B7%A5%E7%A8%8B&score650 即&#xff1a;网址?参数名值&参数名值

指针02 - 零基础入门学习C语言42

第八章&#xff1a;指针02 让编程改变世界 Change the world by program 对“&”和“*”运算符再做些说明 如果已执行了语句 pointer_1 &a; (1) &*pointer_1的含义是什么&#xff1f; “&”和“*”两个运算符的优先级别相同&#xff0c;但按自右而左方向结…

java算法----排序----(6)希尔排序(最小增量排序)

1 package log;2 3 public class Test4 {4 5 /**6 * java算法---希尔排序&#xff08;最小增量排序&#xff09;7 * 8 * param args9 */ 10 public static void main(String[] args) { 11 // 需要排序的数组 12 int arr[] { 49, …

你知道dos和cmd之间的关系以及区别吗?

含义 dos 英文disk operation system&#xff0c;意思是磁盘操作系统是微软系列操作系统之一&#xff0c;dos是一个独立的操作系统&#xff0c;dos对操作人员的要求是比较高的&#xff0c;操作者需要记住很多的命令&#xff0c;并利用命令编写大量的命令行&#xff0c;来完成一…

挨踢项目求生法则-团队建设篇

摘要&#xff1a; 知道什么是挨踢项目吧&#xff1f;什么&#xff01;不知道&#xff1f;那IT项目知道了吧&#xff1f;为了不让客户踢、不让老板踢、项目组成员之间不互相踢&#xff0c;俺为大家分享一些减少被踢机会的心得体会。就算不能让项目成功&#xff0c;也至少不会死得…

【jquery】文档操作

属性 1、attr() 获取、设置属性、设置多个属性 代码实现&#xff1a; alert($("div:first").attr("value")); $("div:first").attr("value","这是第一个div"); $("div:last").attr({value: "这是最后一…

基于流式的md5计算-多线程下载工具Lwget介绍

在数据传输的时候&#xff0c;我们希望实现以下目标&#xff1a;1. 使用多线程传输&#xff0c;加速下载速度2. 数据在传输过程中,进行流式md5计算&#xff0c;避免在传输完毕之后校验大文件3. 支持断点续传4. 支持http协议和ftp协议5. 代码尽可能的简单&#xff0c;利于维护 实…

SpringCloud系列一:SpringCloud的简介和架构

声明&#xff1a;本文来源于MLDN培训视频的课堂笔记&#xff0c;写在这里只是为了方便查阅。 一、SpringCloud简介 SpringCloud就是一套分布式服务治理的框架&#xff0c;既然它是一套服务治理的框架&#xff0c;那么它本身不会提供具体功能性的操作&#xff0c;更专注于服务之…

SUST_ACM_2019届暑期ACM集训热身赛题解

问题A:Hello SUST! 知识点&#xff1a;基本输入输出 C/C&#xff1a; 1 #include <stdio.h>2 3 int main() {4 int n;5 scanf("%d", &n);6 while(n --) {7 printf("Hello SUST!\n");8 }9 return 0; 10 } View Code问…

修改默认的个人站点

1、将模板页加入到里面 在地址C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES\MySiteLayouts中找到 LayoutFiles.xml 然后将master复制到这个文件夹下 最后在LayoutFiles.xml加入如下代码&#xff1a; <Module Name"Mast…

【java】暑期需要复习的操作

实现分页查询 将网页输入的数据存入数据库 将每个jsp文件都需要的代码抽离出来 添加jquery 全选操作 引入jstl 实现全选功能

11迭代器模式

图片来自head first 设计模式&#xff0c;仅供学习之用 事实证明光看是没有用的&#xff0c;实践才能出真知&#xff0c;迭代器模式没有我想想的那么简单&#xff0c;写了个小例子才发现自己的理解并不深刻。例子是仿照head first的。迭代器是一个完整的类&#xff0c;作用是遍…

吴裕雄--天生自然 高等数学学习:高阶偏导数

转载于:https://www.cnblogs.com/tszr/p/11165379.html

【数据库】兴唐第二十六节课作业

一、设计购物车表、支付信息表和订单表 思路&#xff1a; 购物车中有&#xff1a; 商品名、价格、生产日期、 保质期&#xff08;shelf life&#xff09;、生产厂家。 支付信息中有&#xff1a; 商品名、 价格、 件数、 总价 订单信息有&#xff1a; 发货时间、订单号、预计到…

递归与非递归转换(栈知识应用)

下面例题是一次作业中遇到的&#xff0c;很值得体味&#xff0c;与大家共享下。 递归代码&#xff1a; 1 long f(long m,long n) 2 { 3 long sum; 4 if(m0) sumn1; 5 else if(n0) sumf(m-1,1); 6 else kf(m-1,f(m,n-1)); 7 return sum; 8 } 用递归来做很明了&a…

Silverlight 游戏开发小技巧:角色升级特效

这次我们将使用Projection完成一些有趣的RPG游戏中常用的特效&#xff1a;升级和传送点特效&#xff0c;我们不需要请特效师制作复杂绚丽的特效&#xff0c;而是只需要他们提供关键的几张图片或者设计样式&#xff0c;如果了您有本领教会他们使用Blend来做特效&#xff0c;那就…

使用jQuery开发messager消息框插件

1、插件使用 首先引入jquery库&#xff0c;然后引入dialog.js、dialog.css、messager.js、messager.css&#xff0c;如下&#xff1a; 1 <script type"text/javascript" src"js/jquery/jquery-1.7.2.min.js"></script> 2 3 <script type&q…

Data - 深入浅出学统计 - 上篇

本文是已读书籍的内容摘要&#xff0c;少部分有轻微改动&#xff0c;但不影响原文表达。 &#xff1a;以漫画形式来讲解最基本的统计概念和方法。 ISBN: 9787121299636https://book.douban.com/subject/26906845/引言&#xff1a;统计无处不在 统计值无处不在。我们伴随着统计值…

android 布局之RelativeLayout(相对布局)

android 布局分为LinearLayout TableLayout RelativeLayout FreamLayout AbsoluteLayout. 常用的有LinearLayout,TableLayout,RelativeLayout &#xff0c;这几个布局不会应该手机屏幕大小而有变化。通常我们使用HVGA 大小的屏幕(320*480). 接下来我们学习RelativeLayout. 原文…

【js】实现分页查询操作的步骤

1、将CSS的代码复制到goodList.jsp 2、引入common 代码实现&#xff1a; <% include file"../common/common.jsp"%> 3、引入jstl 代码实现&#xff1a; <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%> 注意&…

Orchard:如何生成Hello World模块

在Orchard架构介绍中对Orchard的一些架构内容进行了介绍&#xff0c;下图是Orchard自带的一些模块&#xff0c; 本篇讲解一下如何扩展Orchard来生成我们的第一个模块。 介绍 Orchard构建在ASP.NET MVC之上&#xff0c;MVC是一个应用模式&#xff0c;我在信息系统开发平台OpenE…

通过域名访问自己部署到服务器上的项目

通过域名访问自己部署到服务器上的项目 如何不输入项目名端口号直接访问java web项目 1、省略输入端口号的步骤 在Linux的下面部署了tomcat&#xff0c;为了安全我们使用非root用户进行启动&#xff0c;但是在域名绑定时无法直接访问80端口号。众所周知&#xff0c;在unix下&am…

【java】异常的分类

注&#xff1a; 1、exception是人工可以修复的&#xff0c;但error的话很少出现&#xff0c;如果出现就无能为力了。 2、我们将所有派生于EXCEPTION和ERROR的类的所有异常称为&#xff08;unchecked&#xff09;非受查异常&#xff0c;其余为受查&#xff08;checked&#xf…