展会信息港展会大全

android开发之使用SAX API 开发xml rss解析器
来源:互联网   发布日期:2016-01-19 11:29:12   浏览:1433次  

导读:在Java环境中,当您需要一个速度快的解析器并且希望最大限度减少应用程序的内存占用时,通常可以使用SAX API。这非常适用于运行Android的移动设备。您可以在Java环境中照原样使用SAX API,在Android上运行它不 ...

在Java环境中,当您需要一个速度快的解析器并且希望最大限度减少应用程序的内存占用时,通常可以使用SAX API。这非常适用于运行Android的移动设备。您可以在Java环境中照原样使用SAX API,在Android上运行它不需要做任何修改。显示了de>FeedParserde>接口的一个SAX实现。

如示例所示,一个 de >ITEMde > 对应于一个 de >Messagede > 实例。项目的子节点(de >TITLEde >、de >LINKde > 等)对应于 de >Messagede > 实例的属性。现在,您已经对提要有了一定的认识,并且已经创建了所有常用部分,接下来看看如何使用 Android 上可用的各种技术来解析这个提要。您将从 SAX 开始。

使用 SAX

在 Java 环境中,当您需要一个速度快的解析器并且希望最大限度减少应用程序的内存占用时,通常可以使用 SAX API。这非常适用于运行 Android 的移动设备。您可以在 Java 环境中照原样使用 SAX API,在 Android 上运行它不需要做任何修改。显示了 de >FeedParserde > 接口的一个 SAX 实现。

SAX 实现

java代码:

public class SaxFeedParser extends BaseFeedParser {

protected SaxFeedParser(String feedUrl){

super(feedUrl);

}

public List< Message > parse() {

SAXParserFactory factory = SAXParserFactory.newInstance();

try {

SAXParser parser = factory.newSAXParser();

RssHandler handler = new RssHandler();

parser.parse(this.getInputStream(), handler);

return handler.getMessages();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

}

如果您以前使用过 SAX,那么这对您肯定非常熟悉。与任何 SAX 实现相同,大多数细节都在 SAX 处理程序中。在分解 XML 文档时,处理程序从 SAX 解析器接收事件。在本例中,您创建了一个新的名称为 de >RssHandlerde > 的类,并将它注册为解析器的处理程序,如 所示。

SAX 处理程序

import static org.developerworks.android.BaseFeedParser.*;

public class RssHandler extends DefaultHandler{

private List< Message > messages;

private Message currentMessage;

private StringBuilder builder;

public List< Message > getMessages(){

return this.messages;

}

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

super.characters(ch, start, length);

builder.append(ch, start, length);

}

@Override

public void endElement(String uri, String localName, String name)

throws SAXException {

super.endElement(uri, localName, name);

if (this.currentMessage != null){

if (localName.equalsIgnoreCase(TITLE)){

currentMessage.setTitle(builder.toString());

} else if (localName.equalsIgnoreCase(LINK)){

currentMessage.setLink(builder.toString());

} else if (localName.equalsIgnoreCase(DESCRIPTION)){

currentMessage.setDescription(builder.toString());

} else if (localName.equalsIgnoreCase(PUB_DATE)){

currentMessage.setDate(builder.toString());

} else if (localName.equalsIgnoreCase(ITEM)){

messages.add(currentMessage);

}

builder.setLength(0);

}

}

@Override

public void startDocument() throws SAXException {

super.startDocument();

messages = new ArrayList< Message >();

builder = new StringBuilder();

}

@Override

public void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {

super.startElement(uri, localName, name, attributes);

if (localName.equalsIgnoreCase(ITEM)){

this.currentMessage = new Message();

}

}

}

赞助本站

人工智能实验室

相关热词: SAX API 解析器

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港