HTTP送信して結果XMLの解析

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 を継承したクラスのインスタンスから、
結果の受け取りを行えばよい。