Michael Galpin 是 eBay 的一名架构师。他经常为 developerWorks 撰写文章,同时在 TheServerSide.com 和 Java Developer 期刊上发表文章,他还有自己的 博客。他从 1998 年开始做职业程序员,并拥有加州理工学院数学专业的学士学位。
简介: Android 是针对移动设备的一种新兴的开源操作系统和 SDK。借助它,您可以创建功能强大的移动应用程序。当您的应用程序可以访问 Web 服务时,其吸引力会大大增加,这意味着您需要使用 Web 语言:XML。在本文中,您将了解在 Android 上使用 XML 的不同方法,以及如何使用它们构建自己的 Android 应用程序。
入门
在本文中,您将学习如何构建通过 Internet 使用 XML 的 Android 应用程序。Android 应用程序是使用 Java™ 编程语言编写的,因此具备 Java 技术方面的经验是必需的。要进行 Android 开发,您需要使用 Android SDK。本文中的所有代码适用于任何版本的 Android SDK,但 SDK 1.5_pre 是用于开发代码的。您可以使用 SDK 和一个文本编辑器来开发 Android 应用程序,但使用 Android Developer Tools (ADT)(一款 Eclipse 插件)会更加简单。在本文中,我们使用 0.9 版本的 ADT 和 Eclipse 3.4.2, Java 版本。有关所有这些工具的链接,请参见 参考资料。
Android 上的 XML
Android 平台是一个开源移动开发平台。它允许您访问各种移动设备的所有方面,这些移动设备从低级图形设备到手机摄像头上的硬件不一而足。由于 Android 可以实现这么丰富的功能,因此您可能想知道为何还要为 XML 伤脑筋呢。并不是因为使用 XML 是多么地有趣;而是因为它能提供一些特殊的支持。XML 经常用作 Internet 上的一种数据格式。如果您希望通过 Internet 访问数据,则数据很有可能是 XML 格式。如果您希望发送数据给 Web 服务,那么您可能也需要发送 XML。简而言之,如果您的 Android 应用程序将利用 Internet,那么您可能需要使用 XML。幸运的是,您可以采用多种方法在 Android 上使用 XML。
XML 解析器
Android 平台最大的一个优势在于它利用了 Java 编程语言。Android SDK 并未向您的标准 Java Runtime Environment (JRE) 提供一切可用功能,但它支持其中很大一部分功能。Java 平台支持通过许多不同的方式来使用 XML,并且大多数与 XML 相关的 Java API 在 Android 上得到了完全支持。举例来说,Java 的 Simple API for XML (SAX) 和 Document Object Model (DOM) 在 Android 上都是可用的。这些 API 多年以来一直都是 Java 技术的一部分。较新的 Streaming API for XML (StAX) 在 Android 中并不可用。但是, Android 提供了一个功能相当的库。最后,Java XML Binding API 在 Android 中也不可用。这个 API 已确定可以在 Android 中实现。但是,它更倾向于是一个重量级的 API,需要使用许多不同类的实例来表示 XML 文档。因此,这对于受限的环境,比如说 Android 针对的手持设备,不太理想。在后续小节中,我们将以 Internet 上的一个简单的 XML 源为例,来看看如何在 Android 应用程序中使用上述各种 API 来解析它。首先,我们来看看这个简单应用程序的主要部分,它将通过 Internet 来使用 XML。
常用缩略语
- API:应用程序编程接口(Application programming interface)
- RSS:Really Simple Syndication
- SDK:软件开发包(Software Developers Kit)
- UI:用户界面(User interface)
- URL:通用资源定位符(Universal Resource Locator)
- XML:可扩展标记语言(Extensible Markup Language)
清单 1. XML 提要解析器接口
清单 2. Message POJO
清单 3. 基本提要解析器类
清单 4. 示例 XML 提要
清单 5. SAX 实现
清单 6. SAX 处理程序
清单 7. Android SAX 解析器
清单 8. 经过简化的 Android SAX 解析器
使用 DOM
Android 完全支持 DOM 解析,就像在桌面机器或服务器上使用 Java 代码运行它一样。清单 9 显示了一个基于 DOM 的解析器接口实现。
清单 9. 基于 DOM 的提要解析器实现
与第一个 SAX 示例类似,以上代码完全没有特定于 Android 的地方。DOM 解析器将所有 XML 文档读取到内存中,然后允许您使用 DOM API 遍历 XML 树、检索所需的数据。这是非常直观的代码,并且,在某些方面比基于 SAX 的实现更加简单。但是,DOM 通常更加占用内存,因为一切内容都会先读取到内存中。这对于运行 Android 的移动设备来说是一个问题,但是当 XML 文档始终保持很小的大小时是可行的。这可能意味着,Android 的开发人员会认为 SAX 解析在 Android 应用程序上更加常见,因此为它提供了额外的实用工具。Android 还提供了另一种类型的 XML 解析器,它就是 pull 解析器。
XML pull 解析器
如前所述,Android 并未提供对 Java StAX API 的支持。但是,Android 确实附带了一个 pull 解析器,其工作方式类似于 StAX。它允许您的应用程序代码从解析器中获取事件,这与 SAX 解析器自动将事件推入处理程序相反。清单 10显示了提要解析接口的一个 pull 解析器实现。
清单 10. 基于 Pull 解析器的实现
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
XmlSerializer 类是 前一部分 所使用的 XmlPullParser 包的一部分。它没有提取事件,而是将它们推出到数据流或编写程序中。在本例中,它仅仅将事件推送到了一个 java.io.StringWriter 实例中。它提供了一个直观的 API,通过各种方法开始和结束文档、处理元素以及添加文本或属性。这是 StringBuilder 的一种出色的替换方案,因为它可以更加轻松地确保您的 XML 具有良好结构。
--------------------------------------------------------------------------------
结束语
您希望为 Android 设备构建何种类型的应用程序?无论如何,如果它需要通过 Internet 使用数据,那么都可能需要使用 XML。在本文中,您看到 Android 提供了大量用于处理 XML 的工具。您可以选择其中之一作为自己的工具,或者您可以根据用例来进行选择。大多数时间,使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。如果您的文档比较小,那么 DOM 可能是一种比较简单的方法。如果您的文档比较大,但您只需要文档的一部分,则 XML Pull 解析器可能是更为有效的方法。最后,对于编写 XML,Pull 解析器包也提供了一种便捷的方法。因此,无论您的 XML 需求如何,Android 都能在一定程度上满足它们。
参考资料
学习
用 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 年开始做职业程序员,并拥有加州理工学院数学专业的学士学位。