何一つ誇るものがない

人生のアンチパターン

JavaでXMLを取得して表示する

ggrksしてもトップに出てこなかったのでここに残す。

JavaXMLについて(SAXとかDOMとか)はメンドクサイのでまとめたのを貼っとく。
http://www.evernote.com/shard/s22/sh/90411537-4697-4a68-98b0-e8631fc10a92/d2a48e34b43db9479751833209ad0150

○仕様
 1.JavaでURL接続でXML形式のデータを取得する
2.1で取得したXMLをparseして出力する

で、実装したソース

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.MalformedInputException;

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;


/**
 * @author okada
 *
 */
public class Hogehoge {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws MalformedInputException,
			ProtocolException, IOException {

		URL url = new URL("http://tenki.wet.co.jp/forecast/day01tky.rdf");
		HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
		urlConn.setRequestMethod("GET");
		urlConn.setInstanceFollowRedirects(false);
		urlConn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");

		urlConn.connect();

		Document doc = null;
		try {
			doc = getDocumet(urlConn.getInputStream());
		} catch (SAXException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		// ルートの要素名になっている子ノードを取得する
		Element root = doc.getDocumentElement();
		System.out.println("ルート要素名:" + root.getTagName());

		// 各ノードリストを取得
		NodeList nodeList = root.getElementsByTagName("channel");
		System.out.println("ノードリストの数は:" + nodeList.getLength());

		for (int i = 0; i < nodeList.getLength(); i++) {
			Element element = (Element)nodeList.item(i);
			//

			System.out.println(getChildren(element, "title"));


			System.out.println(getChildren(element, "description"));

			System.out.println(getChildren(element, "pubDate"));

			// 各ノードリストを取得
			NodeList list = element.getElementsByTagName("item");
			System.out.println("リストの数は:" + nodeList.getLength());
			for (int j = 0; j< list.getLength(); j++) {
				Element element2 = (Element)list.item(j);
				System.out.println(getChildren(element2, "title"));

				System.out.println("Link:" + getChildren(element2, "link"));

				System.out.println("description:" + getChildren(element2, "description"));

				System.out.println(getChildren(element2, "pubDate"));
			}
		}

		urlConn.disconnect();
	}

	private static Document getDocumet(InputStream is) throws SAXException,
			IOException, ParserConfigurationException {

		DocumentBuilder docbuilder = DocumentBuilderFactory.newInstance()
				.newDocumentBuilder();
		return docbuilder.parse(is);

	}

	  /**
	   * 指定されたエレメントから子要素の内容を取得。
	   *
	   * @param   element 指定エレメント
	   * @param   tagName 指定タグ名
	   * @return  取得した内容
	   */
	  public static String getChildren(Element element, String tagName) {
	    NodeList list = element.getElementsByTagName(tagName);
	    Element cElement = (Element)list.item(0);
	    return cElement.getFirstChild().getNodeValue();
	  }

}

で実行して、出力すると↓な感じ

ルート要素名:rss
ノードリストの数は:1
天気 -東京都-  ウェザーテック
11日17時発表 東京地方  今夜〔雨〕 明日〔曇 のち 雨〕 明後日〔曇 一時 雨〕 ウェザーテック
Wed, 11 May 2011 17:31:49 +0900
リストの数は:1
11日17時発表 東京地方  今夜〔雨〕 明日〔曇 のち 雨〕 明後日〔曇 一時 雨〕 ウェザーテック
Link:http://tenki.wet.co.jp/forecast/day01tky.htm#area1
description:11日17時発表 東京地方  今夜〔雨〕 明日〔曇 のち 雨〕 明後日〔曇 一時 雨〕 ウェザーテック
Wed, 11 May 2011 17:31:49 +0900
[ CM ] ホームページに天気予報をのせるなら、ここを見てください。
Link:http://wicon.wet.co.jp/?day01rss31
description:[ CM ] ホームページに天気予報をのせるなら、ここを見てください。
Wed, 11 May 2011 17:31:49 +0900
11日17時発表 伊豆諸島北部  今夜〔雨〕 明日〔雨〕 明後日〔晴 一時 雨〕 ウェザーテック
Link:http://tenki.wet.co.jp/forecast/day01tky.htm#area2
description:11日17時発表 伊豆諸島北部  今夜〔雨〕 明日〔雨〕 明後日〔晴 一時 雨〕 ウェザーテック
Wed, 11 May 2011 17:31:49 +0900

ついでにAtndもやってみた。

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.MalformedInputException;

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;


/**
 * @author okada
 *
 */
public class AtndRSS {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws MalformedInputException,
			ProtocolException, IOException {

		URL url =
			new URL("http://atnd.org/events.rss");
		HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
		urlConn.setRequestMethod("GET");
		urlConn.setInstanceFollowRedirects(false);
		urlConn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");

		urlConn.connect();

		Document doc = null;
		try {
			doc = getDocumet(urlConn.getInputStream());
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}

		// ルートの要素名になっている子ノードを取得する
		Element root = doc.getDocumentElement();
		System.out.println("ルート要素名:" + root.getTagName());

		// 各ノードリストを取得
		NodeList nodeList = root.getElementsByTagName("channel");
		System.out.println("ノードリストの数は:" + nodeList.getLength());

		for (int i = 0; i < nodeList.getLength(); i++) {
			Element element1 = (Element)nodeList.item(i);
			//

			System.out.println(getChildren(element1, "title"));


			System.out.println(getChildren(element1, "description"));

			System.out.println(getChildren(element1, "pubDate"));

			// 各ノードリストを取得
			NodeList list = element1.getElementsByTagName("item");
			System.out.println("リストの数は:" + nodeList.getLength());
			for (int j = 0; j< list.getLength(); j++) {
				Element element2 = (Element)list.item(j);
				System.out.println(getChildren(element2, "title"));

				System.out.println("author:" + getChildren(element2, "author"));
				System.out.println("Link:" + getChildren(element2, "link"));

				System.out.println("description:" + getChildren(element2, "description"));

				System.out.println(getChildren(element2, "pubDate"));
			}
		}

		urlConn.disconnect();
	}

	private static Document getDocumet(InputStream is) throws SAXException,
			IOException, ParserConfigurationException {

		DocumentBuilder docbuilder = DocumentBuilderFactory.newInstance()
				.newDocumentBuilder();
		return docbuilder.parse(is);

	}

	  /**
	   * 指定されたエレメントから子要素の内容を取得。
	   *
	   * @param   element 指定エレメント
	   * @param   tagName 指定タグ名
	   * @return  取得した内容
	   */
	  public static String getChildren(Element element, String tagName) {
	    NodeList list = element.getElementsByTagName(tagName);
	    Element cElement = (Element)list.item(0);
	    return cElement.getFirstChild().getNodeValue();
	  }

}

イベント詳細のdescriptionが取得出来なかった。
分かる人がいたら、是非教えてください。

勢いでやっただけなので、もっと上手いやり方があったら教えてください。