【移动应用开发技术】Android SAX解析器怎么实现_第1页
【移动应用开发技术】Android SAX解析器怎么实现_第2页
【移动应用开发技术】Android SAX解析器怎么实现_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】AndroidSAX解析器怎么实现

本篇内容介绍了“AndroidSAX解析器怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让在下带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!de>RssHandlerde>类扩展了de

>org.xml.sax.helpers.DefaultHandlerde>类。该类为SAX

解析器生成的事件所对应的所有方法都提供了一个默认的非操作实现。这允许子类根据需要仅覆盖一些方法。de>RssHandlerde>

提供了一个额外的API,即de>getMessagesde>。它返回处理程序在从SAX解析器接收事件时所收集的de

>Messagede>对象列表。它有另外两个内部变量,de>currentMessagede>针对被解析的

de>Messagede>实例,以及名称为de>builderde>的de

>StringBuilderde>变量,用于存储文本节点中的字符数据。解析器将相应事件发送给处理程序时会调用de

>startDocumentde>方法,这两个变量的初始化操作就是在此时完成。查看de>startElementde>方法。在XML文档中每次遇到开始标记时都会调用它。您只关心该标记何时为de

>ITEMde>标记。对于这种情况,您将创建一个新的de>Messagede>。现在来看de

>charactersde>方法。遇到文本节点中的字符数据时便会调用此方法。数据只是被添加到de>builderde

>变量中。***,我们来看de>endElementde>方法。遇到结束标记时会调用此方法。对于与某de

>Messagede>属性相对应的标记,如de>TITLEde>和de>LINKde

>,则使用de>builderde>变量中的数据在de>currentMessagede>

上设置适当的属性。如果结束标记是一个de>ITEMde>,则de>currentMessagede>

将被添加到Messages列表中。所有这些都是非常典型的SAX解析;此处的一切都不是Android所特有的。因此,如果您知道如何编写

JavaSAX解析器,则应该知道如何编写AndroidSAX解析器。但是,androidsdk确实在SAX上添加了一些便捷的特性。AndroidSAX解析器java代码:public

class

AndroidSaxFeedParser

extends

BaseFeedParser

{

public

AndroidSaxFeedParser(String

feedUrl)

{

super(feedUrl);

}

public

List<

Message

>

parse()

{

RssHandler

handler

=

new

RssHandler();

try

{

Xml.parse(this.getInputStream(),

Xml.Encoding.UTF_8,

handler);

}

catch

(Exception

e)

{

throw

new

RuntimeException(e);

}

return

handler.getMessages();

}

}注意,这个类仍然使用了一个标准的SAX处理程序,因此您仅仅重用了所示的de>RssHandlerde>。能够重用SAX

处理程序是非常不错的,但其代码稍微有些复杂。您可以想像,如果需要解析一个更加复杂的XML文档,则处理程序可能会带来各种各样的

bug。举例来说,回头看看de>endElementde>方法。注意,在尝试设置属性之前,它检查了de

>currentMessagede>是否为null。现在,再回头看看示例XML。注意,de>ITEMde>

标记外部有一些de>TITLEde>和de>LINKde>标记。这就是使用null

检查的原因。否则,每一个de>TITLEde>标记会导致一个de>NullPointerExceptionde

>。Android提供了自己独有的SAXAPI,它排除了您编写自己的SAX处理程序的需要。经过简化的AndroidSAX解析器java代码:public

class

AndroidSaxFeedParser

extends

BaseFeedParser

{

public

AndroidSaxFeedParser(String

feedUrl)

{

super(feedUrl);

}

public

List<

Message

>

parse()

{

final

Message

currentMessage

=

new

Message();

RootElement

root

=

new

RootElement("rss");

final

List<

Message

>

messages

=

new

ArrayList<

Message

>();

Element

channel

=

root.getChild("channel");

Element

item

=

channel.getChild(ITEM);

item.setEndElementListener(new

EndElementListener(){

public

void

end()

{

messages.add(currentMessage.copy());

}

});

item.getChild(TITLE).setEndTextElementListener(new

EndTextElementListener(){

public

void

end(String

body)

{

currentMessage.setTitle(body);

}

});

item.getChild(LINK).setEndTextElementListener(new

EndTextElementListener(){

public

void

end(String

body)

{

currentMessage.setLink(body);

}

});

item.getChild(DESCRIPTION).setEndTextElementListener(new

EndTextElementListener(){

public

void

end(String

body)

{

currentMessage.setDescription(body);

}

});

item.getChild(PUB_DATE).setEndTextElementListener(new

EndTextElementListener(){

public

void

end(String

body)

{

currentMessage.setDate(body);

}

});

try

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论