今回は、Javaの入出力のあと、フォーマットについて。
むかしCSVについては、やった気がするので、今回はXMLについて。
DOMを利用します。
DOMについては、Domによる、XMLデータ操作を、じゃらん宿表示APIで示してみる(その2:説明)で、AJAXを使って実験したので、今回は、これをJAVAでやってみることにします。
また、いままで、JAVA入出力で、InputStreamReader(InputStream)の形にする方法を説明してきたので、今回、その関連についても説明したいと思います。
■方針
DOMを扱う場合、JAVAのバージョン1.4以降では、
import javax.xml.parsers.*;
import org.w3c.dom.*;
をして、
// ドキュメントビルダーファクトリを生成
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
// ドキュメントビルダーを生成
DocumentBuilder builder = dbfactory.newDocumentBuilder();
// パースを実行してDocumentオブジェクトを取得
Document xtree = builder.parse(InputStream);
をすると、Documentが取得できます。
builder.parse(InputStream);のところですが、実は
InputStreamでなくても、URIでもFileでもいいのですが、
今回は、いままでの関係から、InputStreamのケースを利用
したいと思います。
つまり、いままでは
new InputStreamReader(InputStream)だったのですが、
今回は
builder.parse(InputStream);
になったということです。
そして、どっかのページから、InputStreamを取得するため、
URL url = new URL(参照するURL名);
したら、url.openStream()で取得しています。
結果として、
Document xtree = builder.parse(url.openStream());
を実行します。
■問題点
先ほどのAJAXのケースでは、
hotelnode.selectSingleNode
というのを使っていますが、selectSingleNodeメソッドはないので、
FireFoxのケースと同じく、ここで示した
komoku = hotelnode.getElementsByTagName("HotelName");
hotelName[i] = komoku[0].firstChild.nodeValue;
のやりかたを使います。
なお、hotelnodeは、このままではNodeで、getElementsByTagNameが使えないので
Elementにキャストして
komoku = ((Element)hotelnode).getElementsByTagName("HotelName");
のようにします。
■ソース
こんなかんじです。
http://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=130000&l_area=137100&s_area=137102
を検索に行って、ホテル名と住所を画面表示します。
import java.io.*; import java.net.*; import javax.xml.parsers.*; import org.w3c.dom.*; public class test { /* * メイン処理(呼び出し元) */ public static void main(String[] args) { try { int i; // InputStreamを作り出すために // URLを取得 URL url = new URL("http://jws.jalan.net/APILite/HotelSearch/V1/?key=guest&pref=130000&l_area=137100&s_area=137102"); // ドキュメントビルダーファクトリを生成 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); // ドキュメントビルダーを生成 DocumentBuilder builder = dbfactory.newDocumentBuilder(); // パースを実行してDocumentオブジェクトを取得 Document xtree = builder.parse(url.openStream()); // ルート要素を取得 NodeList hotellist = xtree.getElementsByTagName("Hotel"); String buf = ""; for(i = 0 ; i < hotellist.getLength() ; i ++ ) { // 1件分のホテルデータ取り出し Node hotelnode = hotellist.item(i); // 各種データ取り出し NodeList komoku; komoku = ((Element)hotelnode).getElementsByTagName("HotelName"); String HotelName = komoku.item(0).getFirstChild().getNodeValue(); komoku = ((Element)hotelnode).getElementsByTagName("HotelAddress"); String HotelAddress = komoku.item(0).getFirstChild().getNodeValue(); // 書き出し buf = buf + "¥n" + HotelName + " " + HotelAddress; } // 表示 System.out.println(buf); } catch (Exception e) { e.printStackTrace(); } } } |
(上記< > ¥は、本当は半角)
(なお、今回のものは、JavaでHello Worldを参考にしています。
ここ http://www.hellohiro.com/xmldom.htm
バージョン1.3以前のもので、必要なライブラリも、そのサイトに
かいてありました)
