XMLを解析するのに、昔、org.xml.sax.helpers.DefaultHandler を継承して抽象クラスを
用意したことがある。
public abstract class AbstractXmlHandler<T> extends DefaultHandler{
public abstract T result();
public final static <T> XmlParser createParser(String baseName,AbstractXmlHandler<T> handler){
return new XmlParserImpl<T>(baseName,handler);
}
public final static <T> XmlParser createParser(String baseName,AbstractXmlHandler<T> handler,long cacheTime){
return new XmlParserImpl<T>(baseName,handler,cacheTime);
}
}
http://blog.zaq.ne.jp/oboe2uran/article/264/
これを利用して mybatis の Configration.xml で定義された Enviromomet を取得する
ものを書いたこともあった。
http://blog.zaq.ne.jp/oboe2uran/article/465/
しかし、HTTP リクエストを送信してXMLを受信して解析するケースを書いたことがなかった。
そんなに難しいことではない。
HttpURLConnection で応答のストリームを javax.xml.parsers.SAXParser で、用意したAbstractXmlHandler継承インスタンスを渡して parse を実行すればよい。
URL url;
HttpURLConnection uc = null;
OutputStreamWriter osw = null;
:
// HttpURLConnectionオブジェクト取得
uc = (HttpURLConnection)url.openConnection();
/** HTTPリクエストヘッダの設定 */
uc.setDoOutput(true); // こちらからのデータ送信を可能とする
uc.setReadTimeout(timeout); // 読み取りタイムアウト値をミリ秒単位で設定(0は無限)
uc.setRequestMethod(method); // URL 要求のメソッドを設定
SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss",Locale.US);
uc.setRequestProperty("Date"," "+sdf.format(new Date())+" GMT");
if (user != null && passwd != null){
// 基本認証必要ならパラメータを作成する。
uc.setRequestProperty("Authorization"," Basic "+Base64Util.base64Encode(user+":"+passwd));
}
for(Iterator<String> it=headerMap.keySet().iterator();it.hasNext();){
String key = it.next();
uc.setRequestProperty(key,headerMap.get(key));
}
// Content-LengthはPOSTの場合だけ
if (method.equals("POST")){
uc.setRequestProperty("Content-Length",Integer.toString(str.getBytes(encode).length));
//コネクション確立
uc.connect();
osw = new OutputStreamWriter(uc.getOutputStream(), encode);
osw.write(str);
osw.flush();
}
/** 戻り値取得 */
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(uc.getInputStream()
, AbstractXmlHandler を継承したクラスのインスタンス
);
この後、受信そのものが成功なら、SAXParser#parse に渡した
AbstractXmlHandler を継承したクラスのインスタンスから、
結果の受け取りを行えばよい。