2011-01-19 102 views
1

我有一個rss源閱讀器應用程序。目標是將每個項目的標題和圖像存儲在名爲RSSItem的自定義對象中,並將RSSItem對象放在另一個名爲RSSFeed的對象中。問題是,如果項目元素沒有引發SaxException機箱元素。我應該如何處理這個解析器的錯誤?這裏是解析器代碼:處理rss解析器錯誤

public class Parser { 
private final String RSS_ELEMENT = "rss"; 
private final String CHANNEL_ELEMENT = "channel"; 
private final String ITEM_ELEMENT = "item"; 
private final String ENCLOSURE_ELEMENT = "enclosure"; 
private final String TITLE_ELEMENT = "title"; 

private final String URL_ATTRIBUTE = "url"; 
private final String TYPE_ATTRIBUTE = "type"; 

private final String IMAGE_TYPE = "image/jpeg"; 

RSSItem rssItem; 
RSSFeed rssFeed; 

final URL mFeedUrl; 

public Parser(String feedUrl) { 
    try { 
      mFeedUrl = new URL(feedUrl); 
     } catch (MalformedURLException e) { 
     Log.e(e.getClass().getSimpleName(), e.getMessage()); 
      throw new RuntimeException(e); 
     } 
    rssFeed = new RSSFeed(); 
} 

protected InputStream getInputStream() { 
    try { 
    return mFeedUrl.openConnection().getInputStream(); 
    } catch (IOException e) { 
    Log.e(e.getClass().getSimpleName(), e.getMessage()); 
    return null; 
    } 
} 

public RSSFeed parse() { 
    InputStream istream = getInputStream(); 

    RootElement root = new RootElement(RSS_ELEMENT); 
    Element channel = root.requireChild(CHANNEL_ELEMENT); 

    Element itemElement = channel.requireChild(ITEM_ELEMENT); 
    Element enclosure = itemElement.requireChild(ENCLOSURE_ELEMENT); 
    Element title = itemElement.requireChild(TITLE_ELEMENT); 

    enclosure.setStartElementListener(new StartElementListener() { 
    public void start(Attributes attrs) { 
    String imageType = attrs.getValue(TYPE_ATTRIBUTE); 
    if (imageType.equals(IMAGE_TYPE)) { 
    try { 
     String imageUrl = attrs.getValue(URL_ATTRIBUTE); 
     Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent()); 
     rssItem.setImage(bitmap); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
    } 
    }); 

    title.setEndTextElementListener(new EndTextElementListener() { 
    public void end(String body) { 
    rssItem.setTitle(body); 
    } 
    }); 

    itemElement.setStartElementListener(new StartElementListener() { 
    public void start(Attributes arg0) { 
    rssItem = new RSSItem(); 
    } 
    }); 

    itemElement.setEndElementListener(new EndElementListener() { 
    public void end() { 
    rssFeed.addItem(rssItem); 
    } 
    }); 

    try { 
    Xml.parse(istream, Xml.Encoding.UTF_8, root.getContentHandler()); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

    return rssFeed; 
} 
} 

回答

0

我不會推薦嘗試實現自己的RSS解析器,而是使用標準庫。

設置SAX解析器的實現相當容易,但難的部分是能夠解析太陽下的任何和每個feed。

您需要滿足RSS 1,RSS 2,Atom等所有格式。即使這樣,您也必須應對格式不正確的Feed。

我以前遇到過類似的問題,所以決定在服務器上執行我的提要解析並獲取解析的內容。這使我可以運行更復雜的庫和解析器,我可以修改它們而不必爲我的應用程序推送更新。

我有以下服務在AppEngine上運行,它允許在您的最後更簡單的XML/JSON解析。響應有一個固定和簡單的結構。您可以使用此解析

http://evecal.appspot.com/feedParser

您可以發送POST和GET具有下列參數的請求。

feedLink:RSS饋送響應的URL:JSON或XML作爲響應格式

實例:

對於POST請求

捲曲--data-進行urlencode「feedLink = HTTP: //feeds.bbci.co.uk/news/world/rss.xml」 --data-進行urlencode 「響應= JSON」 http://evecal.appspot.com/feedParser

對於GET請求

evecal。 appspot.com/feedParser?feedLink=http://feeds.nytimes.com/nyt/rss/HomePage & response = xml

我的android應用程序「NewsSpeak」也使用它。