在Android上使用XMLWord格式.docx
- 文档编号:21876284
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:22
- 大小:28.56KB
在Android上使用XMLWord格式.docx
《在Android上使用XMLWord格式.docx》由会员分享,可在线阅读,更多相关《在Android上使用XMLWord格式.docx(22页珍藏版)》请在冰豆网上搜索。
中级
其他语言版本:
英文
访问情况
2972次浏览
建议:
0
(添加评论)
平均分(共3个评分)
入门
在本文中,您将学习如何构建通过Internet使用XML的Android应用程序。
Android应用程序是使用Java™编程语言编写的,因此具备Java技术方面的经验是必需的。
要进行Android开发,您需要使用AndroidSDK。
本文中的所有代码适用于任何版本的AndroidSDK,但SDK1.5_pre是用于开发代码的。
您可以使用SDK和一个文本编辑器来开发Android应用程序,但使用AndroidDeveloperTools(ADT)(一款Eclipse插件)会更加简单。
在本文中,我们使用0.9版本的ADT和Eclipse3.4.2,Java版本。
有关所有这些工具的链接,请参见参考资料。
回页首
Android上的XML
Android平台是一个开源移动开发平台。
它允许您访问各种移动设备的所有方面,这些移动设备从低级图形设备到手机摄像头上的硬件不一而足。
由于Android可以实现这么丰富的功能,因此您可能想知道为何还要为XML伤脑筋呢。
并不是因为使用XML是多么地有趣;
而是因为它能提供一些特殊的支持。
XML经常用作Internet上的一种数据格式。
如果您希望通过Internet访问数据,则数据很有可能是XML格式。
如果您希望发送数据给Web服务,那么您可能也需要发送XML。
简而言之,如果您的Android应用程序将利用Internet,那么您可能需要使用XML。
幸运的是,您可以采用多种方法在Android上使用XML。
XML解析器
常用缩略语
∙API:
应用程序编程接口(Applicationprogramminginterface)
∙RSS:
ReallySimpleSyndication
∙SDK:
软件开发包(SoftwareDevelopersKit)
∙UI:
用户界面(Userinterface)
∙URL:
通用资源定位符(UniversalResourceLocator)
∙XML:
可扩展标记语言(ExtensibleMarkupLanguage)
Android平台最大的一个优势在于它利用了Java编程语言。
AndroidSDK并未向您的标准JavaRuntimeEnvironment(JRE)提供一切可用功能,但它支持其中很大一部分功能。
Java平台支持通过许多不同的方式来使用XML,并且大多数与XML相关的JavaAPI在Android上得到了完全支持。
举例来说,Java的SimpleAPIforXML(SAX)和DocumentObjectModel(DOM)在Android上都是可用的。
这些API多年以来一直都是Java技术的一部分。
较新的StreamingAPIforXML(StAX)在Android中并不可用。
但是,Android提供了一个功能相当的库。
最后,JavaXMLBindingAPI在Android中也不可用。
这个API已确定可以在Android中实现。
但是,它更倾向于是一个重量级的API,需要使用许多不同类的实例来表示XML文档。
因此,这对于受限的环境,比如说Android针对的手持设备,不太理想。
在后续小节中,我们将以Internet上的一个简单的XML源为例,来看看如何在Android应用程序中使用上述各种API来解析它。
首先,我们来看看这个简单应用程序的主要部分,它将通过Internet来使用XML。
Android新闻阅读器
应用程序将从热门Android开发人员站点Androidster获取一个RSS提要,并将它解析为一组简单的Java对象,您可以使用这些对象构建一个AndroidListView(参见下载部分获取源代码)。
这是一种典型的多态行为—提供相同行为的不同实现(不同的XML解析算法)。
清单1展示了如何在Java代码中使用一个接口建立这一模型。
清单1.XML提要解析器接口
packageorg.developerworks.android;
importjava.util.List;
publicinterfaceFeedParser{
List<
Message>
parse();
}
在清单2中,Message类是一个典型的PlainOldJavaObject(POJO),它表示一种数据结构。
清单2.MessagePOJO
publicclassMessageimplementsComparable<
{
staticSimpleDateFormatFORMATTER=
newSimpleDateFormat("
EEE,ddMMMyyyyHH:
mm:
ssZ"
);
privateStringtitle;
privateURLlink;
privateStringdescription;
privateDatedate;
//gettersandsettersomittedforbrevity
publicvoidsetLink(Stringlink){
try{
this.link=newURL(link);
}catch(MalformedURLExceptione){
thrownewRuntimeException(e);
}
publicStringgetDate(){
returnFORMATTER.format(this.date);
publicvoidsetDate(Stringdate){
//padthedateifnecessary
while(!
date.endsWith("
00"
)){
date+="
0"
;
this.date=FORMATTER.parse(date.trim());
}catch(ParseExceptione){
@Override
publicStringtoString(){
//omittedforbrevity
publicinthashCode(){
publicbooleanequals(Objectobj){
//sortbydate
publicintcompareTo(Messageanother){
if(another==null)return1;
//sortdescending,mostrecentfirst
returnpareTo(date);
清单2中的消息基本上是相当直观的。
通过允许日期和链接作为简单的对象被访问,同时将它们表示为较强类型的对象(java.util.Date和.URL),它隐藏了一些内部状态。
它是一个典型的ValueObject,因此它基于其内部状态实现了equals()和hashCode()。
它还实现了Comparable接口,因此您可以使用它进行排序(按日期)。
在实践中,提要中的数据始终是有序的,因为没有必要再进行排序。
每个解析器实现都需要提供一个URL给Androidster提要,并使用它打开一个到Androidster站点的HTTP连接。
这一常见行为自然是在Java代码中建模,我们使用了一个抽象基类,如清单3所示。
清单3.基本提要解析器类
publicabstractclassBaseFeedParserimplementsFeedParser{
//namesoftheXMLtags
staticfinalStringPUB_DATE="
pubDate"
staticfinalStringDESCRIPTION="
description"
staticfinalStringLINK="
link"
staticfinalStringTITLE="
title"
staticfinalStringITEM="
item"
finalURLfeedUrl;
protectedBaseFeedParser(StringfeedUrl){
this.feedUrl=newURL(feedUrl);
protectedInputStreamgetInputStream(){
returnfeedUrl.openConnection().getInputStream();
}catch(IOExceptione){
基类存储feedUrl并使用它打开了一个java.io.InputStream。
如果出现任何差错,它会抛出一个RuntimeException,造成应用程序出现故障。
基类还为标记的名称定义了一些简单的常量。
清单4显示了提要中的一些示例内容,以便于您理解这些标记的重要性。
清单4.示例XML提要
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
!
--generator="
FeedCreator1.7.2"
-->
rssversion="
2.0"
<
channel>
title>
android_news<
/title>
description>
/description>
link>
lastBuildDate>
Sun,19Apr200919:
43:
45+0100<
/lastBuildDate>
generator>
FeedCreator1.7.2<
/generator>
item>
SamsungS8000toRunAndroid,PlayDivX,TakeOverthe
World<
play-divx-take-over-the-world<
/link>
MoredetailshaveemergedonthefirstSamsunghandset
torunAndroid.Ayet-to-beannouncedphonecalledtheS8000isbeing
reported...<
pubDate>
Thu,16Apr200907:
18:
51+0100<
/pubDate>
/item>
AndroidCupcakeUpdateontheHorizon<
on-the-horizon<
Aftermonthsofdiscoveryandhearsay,theAndroid
buildthatwehaveallbeenwaitingforisabouttofinallymakeit
out...<
Tue,14Apr200904:
13:
21+0100<
/channel>
/rss>
如清单4中的示例所示,一个ITEM对应于一个Message实例。
项目的子节点(TITLE、LINK等)对应于Message实例的属性。
现在,您已经对提要有了一定的认识,并且已经创建了所有常用部分,接下来看看如何使用Android上可用的各种技术来解析这个提要。
您将从SAX开始。
使用SAX
在Java环境中,当您需要一个速度快的解析器并且希望最大限度减少应用程序的内存占用时,通常可以使用SAXAPI。
这非常适用于运行Android的移动设备。
您可以在Java环境中照原样使用SAXAPI,在Android上运行它不需要做任何修改。
清单5显示了FeedParser接口的一个SAX实现。
清单5.SAX实现
publicclassSaxFeedParserextendsBaseFeedParser{
protectedSaxFeedParser(StringfeedUrl){
super(feedUrl);
publicList<
parse(){
SAXParserFactoryfactory=SAXParserFactory.newInstance();
SAXParserparser=factory.newSAXParser();
RssHandlerhandler=newRssHandler();
parser.parse(this.getInputStream(),handler);
returnhandler.getMessages();
}catch(Exceptione){
}
如果您以前使用过SAX,那么这对您肯定非常熟悉。
与任何SAX实现相同,大多数细节都在SAX处理程序中。
在分解XML文档时,处理程序从SAX解析器接收事件。
在本例中,您创建了一个新的名称为RssHandler的类,并将它注册为解析器的处理程序,如清单6所示。
清单6.SAX处理程序
importstaticorg.developerworks.android.BaseFeedParser.*;
publicclassRssHandlerextendsDefaultHandler{
privateList<
messages;
privateMessagecurrentMessage;
privateStringBuilderbuilder;
getMessages(){
returnthis.messages;
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException{
super.characters(ch,start,length);
builder.append(ch,start,length);
publicvoidendElement(Stringuri,StringlocalName,Stringname)
super.endElement(uri,localName,name);
if(this.currentMessage!
=null){
if(localName.equalsIgnoreCase(TITLE)){
currentMessage.setTitle(builder.toString());
}elseif(localName.equalsIgnoreCase(LINK)){
currentMessage.setLink(builder.toString());
}elseif(localName.equalsIgnoreCase(DESCRIPTION)){
currentMessage.setDescription(builder.toString());
}elseif(localName.equalsIgnoreCase(PUB_DATE)){
currentMessage.setDate(builder.toString());
}elseif(localName.equalsIgnoreCase(ITEM)){
messages.add(currentMessage);
builder.setLength(0);
publicvoidstartDocument()throwsSAXException{
super.startDocument();
messages=newArrayList<
();
builder=newStringBuilder();
publicvoidstartElement(Stringuri,StringlocalName,Stringname,
Attributesattributes)throwsSAXException{
super.startElement(uri,localName,name,attributes);
if(localName.equalsIgnoreCase(ITEM)){
this.currentMessage=newMessage();
RssHandler类扩展了org.xml.sax.helpers.DefaultHandler类。
该类为SAX解析器生成的事件所对应的所有方法都提供了一个默认的非操作实现。
这允许子类根据需要仅覆盖一些方法。
RssHandler提供了一个额外的API,即getMessages。
它返回处理程序在从SAX解析器接收事件时所收集的Message对象列表。
它有另外两个内部变量,currentMessage针对被解析的Message实例,以及名称为builder的StringBuilder变量,用于存储文本节点中的字符数据。
解析器将相应事件发送给处理程序时会调用startDocument方法,这两个变量的初始化操作就是在此时完成。
查看清单6中的startElement方法。
在XML文档中每次遇到开始标记时都会调用它。
您只关心该标记何时为ITEM标记。
对于这种情况,您将创建一个新的Message。
现在来看characters方法。
遇到文本节点中的字符数据时便会调用此方法。
数据只是被添加到builder变量中。
最后,我们来看endElement方法。
遇到结束标记时会调用此方法。
对于与某Message属性相对应的标记,如TITLE和LINK,则使用builder变量中的数据在currentMessage上设置适当的属性。
如果结束标记是一个ITEM,则currentMessage将被添加到Messages列表中。
所有这些都是非常典型的SAX解析;
此处的一切都不是Android所特有的。
因此,如果您知道如何编写JavaSAX解析器,则应该知道如何编写AndroidSAX解析器。
但是,AndroidSDK确实在SAX上添加了一些便捷的特性。
更加简单的SAX解析
AndroidSDK提供了一个名称为android.util.Xml的实用类。
清单7展示了如何使用这个相同的实用类来设置一个SAX解析器。
清单7.AndroidSAX解析器
publicclassAndroidSaxFeedParserextendsBaseFeedParser{
publicAndroidSaxFeedParser(StringfeedUrl){
Xml.p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 使用 XML