2011-06-24 36 views
1

我試圖解析rss提要,它似乎獲取所有節點但沒有子元素,它們都返回null。幫助解析RSS提要。所有元素返回null

Java代碼:

package com.nasutek.sliceoftech; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class RSSParser { 
    private ArrayList<RSSPost> rssposts; 
    private DocumentBuilderFactory factory; 
    private DocumentBuilder builder; 
    public RSSParser() { 
     this.rssposts = new ArrayList<RSSPost>(); 
    } 

    private String getNodeValue(NamedNodeMap map, String key) { 
     String nodeValue = null; 
     Node node = map.getNamedItem(key); 
     if (node != null) { 
      nodeValue = node.getNodeValue(); 
     } 
     return nodeValue; 
    } 
    public List<RSSPost> getList() { 
     return this.rssposts; 
    } 
    public void parse(InputStream inStream) { 
     try { 
      this.rssposts = new ArrayList<RSSPost>(); 
      this.factory = DocumentBuilderFactory.newInstance(); 
      this.builder = this.factory.newDocumentBuilder(); 
      this.builder.isValidating(); 
      Document doc = this.builder.parse(inStream, null); 

      doc.getDocumentElement().normalize(); 

      NodeList itemList = doc.getElementsByTagName("item"); 
      final int length = itemList.getLength(); 

      for (int i = 0; i < length; i++) { 
       final NamedNodeMap attr = itemList.item(i).getAttributes(); 
       final String rss_title = getNodeValue(attr, "title"); 
       final String rss_link = getNodeValue(attr, "link"); 
       final String rss_pubDate = getNodeValue(attr, "pubDate"); 
       final String rss_creator = getNodeValue(attr, "dc:creator"); 
       final String rss_sharelink = getNodeValue(attr, "guid"); 
       final String rss_description = getNodeValue(attr, "description"); 
       final String rss_content = getNodeValue(attr, "content:encoded"); 
       final String rss_thumbnail = itemList.item(i).getNodeName(); 

       RSSPost post = new RSSPost(rss_title,rss_link,rss_pubDate,rss_creator,rss_sharelink,rss_description,rss_content,rss_thumbnail); 

       if (post.title != null) this.rssposts.add(post); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

RSS訂閱:

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
    > 

<channel> 
    <title>Slice of Tech &#187; Search Results &#187; Google</title> 
    <atom:link href="http://www.sliceoftech.com/feed?s=Google" rel="self" type="application/rss+xml" /> 
    <link>http://www.sliceoftech.com</link> 
    <description>Technology breaking news, reviews, and editorials</description> 

    <lastBuildDate>Fri, 24 Jun 2011 04:43:11 +0000</lastBuildDate> 
    <language>en</language> 
    <sy:updatePeriod>hourly</sy:updatePeriod> 
    <sy:updateFrequency>1</sy:updateFrequency> 
    <generator>http://wordpress.org/?v=3.1.3</generator> 
     <item> 

     <title>Best Buy Joins the Music Cloud Bandwagon</title> 
     <link>http://www.sliceoftech.com/2011/06/best-buy-joins-the-music-cloud-bandwagon/</link> 
     <comments>http://www.sliceoftech.com/2011/06/best-buy-joins-the-music-cloud-bandwagon/#comments</comments> 
     <pubDate>Wed, 22 Jun 2011 05:59:18 +0000</pubDate> 
     <dc:creator>Kevin Nunez</dc:creator> 
       <category><![CDATA[Cloud]]></category> 

     <category><![CDATA[Best Buy]]></category> 
     <category><![CDATA[Cloud computing]]></category> 

     <guid isPermaLink="false">http://www.sliceoftech.com/?p=98</guid> 
     <description><![CDATA[So we&#8217;ve seen cloud music storing services from Amazon, Google, and Apple &#8211; all of which work great. Best Buy, however, has decided to join the mix and come up with a cloud service themselves. They rolled out their new service called Music Cloud that lets you upload your audio to their servers and stream [...]]]></description> 
      <content:encoded><![CDATA[<p style="text-align: left;"><a href="http://www.sliceoftech.com/wp-content/uploads/2011/06/Screen-Shot-2011-06-22-at-1.57.13-AM.png"><br /> 
<img class="aligncenter size-full wp-image-99" title="Screen Shot 2011-06-22 at 1.57.13 AM" src="http://www.sliceoftech.com/wp-content/uploads/2011/06/Screen-Shot-2011-06-22-at-1.57.13-AM.png" alt="" width="550" height="194" /></a></p> 
<p style="text-align: left;">So we&#8217;ve seen cloud music storing services from Amazon, Google, and Apple &#8211; all of which work great. Best Buy, however, has decided to join the mix and come up with a cloud service themselves. They rolled out their new service called Music Cloud that lets you upload your audio to their servers and stream it from wherever you are. You can also save songs locally, and there&#8217;s apps for Android, BlackBerry, and iOS to manage and play your music. There are two versions of the service &#8211; Lite and Premium. Lite is free while premium is $3.99 per month, but Best Buy hasn&#8217;t disclosed in their official blog post what pro users will get over the free guys. Also, the service only catches songs from iTunes and not from anywhere else, so for those who avoid iTunes at all costs (don&#8217;t blame ya), you&#8217;re outta luck.</p> 
<p style="text-align: left;">Why Best Buy would do this is beyond me, but I guess they thought it would be a good move to make. When it rains, it pours, and it&#8217;s certainly very &#8220;cloudy&#8221; in the tech world. Will you use Best Buy&#8217;s cloud service?</p> 
<p>[via <a href="http://news.yahoo.com/s/digitaltrends/20110621/tc_digitaltrends/bestbuysoftlaunchesmusiccloudservice">Yahoo News</a>]<br /> 
Source: <a href="http://www.bestbuymobile.com/article/inside-best-buy-music-cloud">Best Buy Blog</a></p> 
]]></content:encoded> 
      <wfw:commentRss>http://www.sliceoftech.com/2011/06/best-buy-joins-the-music-cloud-bandwagon/feed/</wfw:commentRss> 
     <slash:comments>0</slash:comments> 

    <enclosure url="http://www.sliceoftech.com/wp-content/uploads/2011/06/Screen-Shot-2011-06-22-at-1.57.13-AM-300x105.png" length="32141" type="image/jpg" /> </item> 
    </channel> 
</rss> 

回答

0

看起來你已經變得有點混淆。你已經使用了getAttributes,它返回一個元素的屬性,在你的情況下是沒有屬性的item元素。如果你已經在guid元素上運行了它,你會得到一個isPermaLink值。

這個例子是什麼讓我獲得該項目的詳細信息:

http://javamix.wordpress.com/2009/06/09/read-rss-feeds-using-jsp/

因此,而不是使用的getAttributes我用這條線:

final Element element = (Element)itemList.item(i); 

然後得到一點點數據是這種風格:

final String rss_title = getElementValue(element, "title"); 

我只能夠t o在Eclipse中運行此計算機,因爲我沒有安裝Android。但我不明白爲什麼它不能在Android上工作。

+0

@Kioskhiki感謝您的回覆..雖然我似乎沒有任何改變的結果:/它都返回空..然後我可以做錯了.. http://pastebin.com/ b4rPaSes – Lexious

+0

@ Alex1994很奇怪,我能夠運行代碼並獲取值。我只是將更新的類複製到我的項目中,並將其重命名爲該類,以便它可以運行。 我使用了這種類型的url文件:/ D:/local/path/test.xml 該文件包含您示例中的xml。我們是否在同一個JRE上運行?我只是最新的1.6.0_26 – Kioshiki