2011-06-24 19 views
1

私はRSSフィードを解析しようとしていますが、すべてのノードを取得しているようですが、サブ要素のいずれも取得していないようです。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); 

をデータはこのスタイルでした:

私はできました私はAndroidを利用できないので、Eclipseの私のPCでこれを実行してください。私はそれがなぜAndroidではうまくいかないのか分からない。

+0

@キオスキキキ返信ありがとうございました。私は結果に変更がないようですが、/それはすべてnullを返します..再び間違っている可能性があります.. http://pastebin.com/ b4rPaSes – Lexious

+0

@ Alex1994それは奇妙なことですが、私はあなたのコードを実行して値を得ることができました。私はちょうど私のプロジェクトにあなたの更新されたクラスをコピーし、それが実行されるようにクラスの名前を変更しました。 このタイプのURLファイルを使用しました。/ D:/local/path/test.xml そのファイルには、例のXMLが含まれています。私たちは同じJREで動作していますか?私はちょうど最新の1.6.0_26です – Kioshiki

関連する問題