2011-01-19 3 views
1

私はrssフィードリーダーアプリケーションを持っています。目標は、RSSItemという名前のカスタムオブジェクトに各アイテムのタイトルとイメージを格納し、RSSFeedという名前の別のオブジェクトにRSSItemオブジェクトを格納することです。問題は、アイテム要素にエンクロージャー要素がない場合、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パーサーの実装をセットアップするのはかなり簡単ですが、難しい部分は太陽の下であらゆるフィードを解析できることです。

RSS 1、RSS 2、Atomなどのすべてのフォーマットに対応する必要があります。その場合でも、フォーマットの不適切なフィードと競合する必要があります。

私は過去に同様の問題に直面していましたので、サーバーでフィード解析を行い、解析されたコンテンツを取得することにしました。これにより、私のアプリケーションの更新を押し出すことなく変更できるより複雑なライブラリとパーサを実行することができます。

私はAppEngine上で以下のサービスを実行しています。これにより、より簡単なXML/JSON解析が可能になります。応答には固定された単純な構造があります。あなたは、両方のPOSTを送信し、次のパラメータを使用して要求を取得することができます

http://evecal.appspot.com/feedParser

を解析するためにこれを使用することができます。応答形式としてJSON又はXML

例:

feedLink:RSSフィード応答のURL POSTリクエストについて

カール--data-でurlencode「feedLink = HTTP: GETリクエスト

evecalについては//feeds.bbci.co.uk/news/world/rss.xml」--data-でurlencode "レスポンス= jsonの" http://evecal.appspot.com/feedParser

。 appspot.com/feedParser?feedLink=http://feeds.nytimes.com/nyt/rss/HomePage &レスポンス= xml

私のAndroidアプリ「NewsSpeak」もこれを使用しています。