2011年5月19日木曜日

[Java]RSSを読み込んで表示するプログラムをさっくり作る

すごーく前のエントリで「bot」をつくってます☆
とかいたとおもいますが、かなり進んでいません。
というのも、DBを扱わないといけなくて、そこで躓いているんですが。
まー、それもよくないなと思って、とりあえずできることからはじめてみます。
Yahoo!天気情報でRSSが提供されているのでそこから天気情報を取り込むプログラムをつくることにしました。
Yahoo!天気情報提供RSSについてはこちら

ではさっそくJavaでさくさくと。
東京都の天気を読み込むものをつくってみました。

まずは面倒なのでRSSのアドレスを定義します。

private static final String RSS_URL= "http://rss.weather.yahoo.co.jp/rss/days/13.xml";

続いてDocumentにRSSの情報をパースします。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  
   DocumentBuilder builder = factory.newDocumentBuilder();
   
   Document document = builder.parse(RSS_URL);

読み込んだXMLに対して要素を抜き出していく感じですね。
いきなり飛び越しで読み込めないので
順番を追って読み出します。
個人的には"title"と"description"が必要なのでそちらだけを読み込みます。

// ドキュメントのルートを取得
   Element root = document.getDocumentElement();
   
   // ルート直下の"channel"に含まれるノードリストを取得
   NodeList channel = root.getElementsByTagName("channel");
   
   // "channel"直下の"title"に含まれるノードリストを取得
   NodeList title = ((Element)channel.item(0)).getElementsByTagName("title");
   
   // とりあえず出力する
   System.out.println("タイトル:" + title.item(0).getFirstChild().getNodeValue());
   
   // 各"item"とその中の"title"とを取得する。     
   NodeList item_list = root.getElementsByTagName("item");
   
   // item分ループする
   for(int i = 0; i < item_list.getLength(); i++) {
    
    Element element = (Element)item_list.item(i);

    // title を取得する
                NodeList item_title = element.getElementsByTagName("title");
                // description を取得する
                NodeList item_description = element.getElementsByTagName("description");

                // 出力する
                System.out.println(item_title.item(0).getFirstChild().getNodeValue());
                System.out.println(item_description.item(0).getFirstChild().getNodeValue());
                
   }
もちろん、try-catchで囲まないといけないので実際のソースはこうなります。
import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class RSS_Test {

 private static final String RSS_URL= "http://rss.weather.yahoo.co.jp/rss/days/13.xml";
 
 public static void main(String[] args) {
  
  try {
   
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  
   DocumentBuilder builder = factory.newDocumentBuilder();
   
   Document document = builder.parse(RSS_URL);
   
   // ドキュメントのルートを取得
   Element root = document.getDocumentElement();
   
   // ルート直下の"channel"に含まれるノードリストを取得
   NodeList channel = root.getElementsByTagName("channel");
   
   // "channel"直下の"title"に含まれるノードリストを取得
   NodeList title = ((Element)channel.item(0)).getElementsByTagName("title");
   
   // とりあえず出力する
   System.out.println("タイトル:" + title.item(0).getFirstChild().getNodeValue());
   
   // 各"item"とその中の"title"と"description"を取得する。     
   NodeList item_list = root.getElementsByTagName("item");
   
   // item分ループする
   for(int i = 0; i < item_list.getLength(); i++) {
    
    Element element = (Element)item_list.item(i);

    // title を取得する
                NodeList item_title = element.getElementsByTagName("title");
                // description を取得する
                NodeList item_description = element.getElementsByTagName("description");

                // 出力する
                System.out.println(item_title.item(0).getFirstChild().getNodeValue());
                System.out.println(item_description.item(0).getFirstChild().getNodeValue());
                
   }
   
   
  } catch (ParserConfigurationException e) {
   e.printStackTrace();
  } catch (SAXException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }

}
で、取得したデータはこんな感じになります。
タイトル:Yahoo!天気情報 - 東京都の天気
【 19日(木) 東京(東京) 】 晴時々曇 - 24℃/16℃ - Yahoo!天気情報
晴時々曇 - 24℃/16℃
【 19日(木) 伊豆諸島北部(大島) 】 晴れ - 23℃/15℃ - Yahoo!天気情報
晴れ - 23℃/15℃
【 19日(木) 伊豆諸島南部(八丈島) 】 晴時々曇 - 23℃/16℃ - Yahoo!天気情報
晴時々曇 - 23℃/16℃
【 19日(木) 小笠原諸島(父島) 】 曇後雨 - 24℃/22℃ - Yahoo!天気情報
曇後雨 - 24℃/22℃
[PR] 「東日本大震災」に関する情報
「東日本大震災」に関する情報

[PR]ってなんだろ・・・(汗)
とりあえず、こんな感じで。

0 件のコメント:

コメントを投稿