Android XML讀寫(四)
如示例所示,一個(gè) de >ITEMde > 對(duì)應(yīng)于一個(gè) de >Messagede > 實(shí)例。項(xiàng)目的子節(jié)點(diǎn)(de >TITLEde >、de >LINKde > 等)對(duì)應(yīng)于 de >Messagede > 實(shí)例的屬性?,F(xiàn)在,您已經(jīng)對(duì)提要有了一定的認(rèn)識(shí),并且已經(jīng)創(chuàng)建了所有常用部分,接下來看看如何使用 Android 上可用的各種技術(shù)來解析這個(gè)提要。您將從 SAX 開始。
使用 SAX
在 Java 環(huán)境中,當(dāng)您需要一個(gè)速度快的解析器并且希望***限度減少應(yīng)用程序的內(nèi)存占用時(shí),通??梢允褂?SAX API。這非常適用于運(yùn)行 Android 的移動(dòng)設(shè)備。您可以在 Java 環(huán)境中照原樣使用 SAX API,在 Android 上運(yùn)行它不需要做任何修改。顯示了 de >FeedParserde > 接口的一個(gè) SAX 實(shí)現(xiàn)。
SAX 實(shí)現(xiàn)
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,那么這對(duì)您肯定非常熟悉。與任何 SAX 實(shí)現(xiàn)相同,大多數(shù)細(xì)節(jié)都在 SAX 處理程序中。在分解 XML 文檔時(shí),處理程序從 SAX 解析器接收事件。在本例中,您創(chuàng)建了一個(gè)新的名稱為 de >RssHandlerde > 的類,并將它注冊(cè)為解析器的處理程序,如 所示。
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();
- }
- }
- }