2010-12-12 18 views
1

Android用の非常にシンプルなRSSリーダーを学習体験として取り組んでいます。私はフィードを解析するためにXmlPullParserを使用することを決定しました。回答をウェブで精査しても解決できないように見えるテストフィード(rss.slashdot.org/slashdot/slashdot)を解析しようとするとエラーが発生します。 (日食からの)エラーは、次のとおりです。Android Pull Parsing RSSフィードのトラブル

START_TAG <image>@2:1252 in [email protected] 
START_TAG (empty) <{http://www.w3.org/2005/Atom}atom10:link rel='self' type='application/rss+xml' href='http://rss.slashdot.org/Slashdot/slashdot'>@2:1517 in [email protected] 
DEBUG/JRSS(313): java.net.MalformedURLException: Protocol not found: 

問題のファイルです:

<image> 
    ... 
</image> 
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://rss.slashdot.org/Slashdot/slashdot" /> 
<feedburner:info uri="slashdot/slashdot" /> 
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /> 
    ... 

ので、エラーがFeedBurnerのタグで発生するように見えます。

最後に、私のコードは次のようになります(この時点で私はFeedBurnerのタグを気にしないので)ただ、これを無視する方法があるかどう

public class XmlHelper 
{ 
    private XmlPullParserFactory factory; 
    private XmlPullParser xpp; 
    private final int START_TAG = XmlPullParser.START_TAG; 

    // Debugging Tag 
    private final String TAG = "JRSS"; 

    // for channels and items 
    private final String TITLE = "title"; 
    private final String LINK = "link"; 
    private final String DESCRIPTION = "description"; 
    private final String PUBDATE = "pubDate"; 

    // element keys for channel 
    private final String LANGUAGE = "language"; 
    private final String IMAGE = "image"; 
    private final String ITEM = "item"; 

    // for items 
    private final String AUTHOR = "author"; 

    // for images 
    private final String URL = "url"; 
    private final String WIDTH = "width"; 
    private final String HEIGHT = "height"; 

    public XmlHelper(Context context) 
    { 
     try 
    { 
     factory = XmlPullParserFactory.newInstance(); 
    } 
    catch (XmlPullParserException e) 
    { 
     Log.d(TAG, e.toString()); 
    } 
     factory.setNamespaceAware(true); 
    } 

    public Channel addFeed(URL url) throws XmlPullParserException, IOException 
    {  
     Channel c = new Channel(); 
     c.items = new ArrayList<Item>(); 

     xpp = factory.newPullParser(); 
     xpp.setInput(url.openStream(), null); 

     // move past rss element 
     xpp.nextTag(); 
     // move past channel element 
     xpp.nextTag(); 

     while(xpp.nextTag() == START_TAG) 
     { 
      Log.d(TAG, xpp.getPositionDescription()); 

      if(xpp.getName().equals(TITLE)) 
       c.title = xpp.nextText(); 

      else if(xpp.getName().equals(LINK)) 
       c.url = new URL(xpp.nextText()); 

      else if(xpp.getName().equals(DESCRIPTION)) 
       c.description = xpp.nextText(); 

      else if(xpp.getName().equals(LANGUAGE)) 
       c.language = xpp.nextText(); 

      else if(xpp.getName().equals(ITEM)) 
      { 
       Item i = parseItem(xpp); 
       c.items.add(i); 
      } 

      else if(xpp.getName().equals(IMAGE)) 
      { 
       parseImage(xpp); 
      } 

      else 
       xpp.nextText(); 
     } 

     return c; 
    } 

    public Item parseItem(XmlPullParser xpp) throws MalformedURLException, XmlPullParserException, IOException 
    { 
    Item i = new Item(); 

    while(xpp.nextTag() == START_TAG) 
    { 
      // do nothing for now 
     xpp.nextText(); 
    } 

     return i; 
    } 

    private void parseImage(XmlPullParser xpp) throws XmlPullParserException, IOException 
    { 
     // do nothing for now 
     while(xpp.nextTag() == START_TAG) 
     { 
      xpp.nextText(); 
     } 
    } 

私は本当に分からない場合、またはそこに私がこの作業をするために設定できるパーサの機能です。あるいは、これについて間違った方法をとっている場合です。どんな助け/助言/指導も高く評価されます。

答えて

0

SAXよりもプル構文解析が効率的です。しかし、私の意見では、あなたのRSSフィードがそこにあるフィードを解析することができるようにするためには、まだ多くのことが必要です。

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」もこれを使用しています。