2010-12-12 133 views
1

我正在研究Android的一個非常簡單的RSS閱讀器作爲學習體驗。我決定使用XmlPullParser來解析提要,因爲它非常簡單並且具有可接受的效率水平(符合我的需要)。在嘗試解析我的測試提要(rss.slashdot.org/slashdot/slashdot)時出現錯誤,我似乎無法解決,儘管在網上尋找答案。 (從蝕)的錯誤是:Android Pull解析RSS Feed煩惱

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的標籤出現。

終於,我的代碼是:

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(); 
     } 
    } 

我真的不知道,如果有一種方法只是忽略這一點(因爲在這一點上我不關心的是FeedBurner標籤)或有是解析器的一些功能,我可以設置這個功能,或者如果我以錯誤的方式解決這個問題。任何幫助/建議/指導將不勝感激。

回答

0

PullParsing比SAX更高效。但在我看來,它仍然留下了很多需要做的事情,讓您的RSS提要能夠解析任何提要。

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

我以前遇到過類似的問題,所以決定在服務器上執行我的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」也使用它。