//********************************************************************
// GetXMLData.java
// このプログラムは、SQL Server 2000 に登録されているデータを XML 形式
// で取出し、ファイルに保存する処理をします。
// 実行時の入力パラメタとしてデータを保存するファイル名を指定します。
//********************************************************************
import java.io.*;
import java.sql.*;

public class GetXMLData {

	public static void main(String[] args) throws Exception {
		// 入力パラメタがない場合メッセージを表示して終了する
		if (args[0] == null) {
			System.out.println("取得したデータを格納するＸＭＬファイル名を指定してください。");
			System.out.println("GetXMLData filename.xml");
			System.exit( 1 );
		}

		try {
			// JDBC−ODBCドライバの登録
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} catch(java.lang.ClassNotFoundException e) {
			System.err.print("ClassNotFoundException: ");
			System.err.println(e.getMessage());
		}

		// SQL Server 2000 からデータを XML 形式で取出す処理
		try {
			// XML データ格納領域
			String strXML = null;
			// データクエリ用 SQL 文
			String strQuery = "SELECT * FROM Person FOR XML AUTO ,ELEMENTS";
			// JDBC 接続オブジェクト作成（データベース名：TestDB）
			// データを取出すデータベースへの接続オブジェクトを作成する
			Connection objCon = DriverManager.getConnection("jdbc:odbc:Test1", "sa", "sa");
			// SQL オブジェクト作成
			Statement objStmt = objCon.createStatement();
			// データクエリ実行（XML 形式で取得）
			ResultSet objRes = objStmt.executeQuery(strQuery);
			objRes.next();
			// ユニコードからシフトJISコードへ変換
			strXML = getUnicodeString( objRes, 1 );
			// オブジェクトの解放
			objRes.close();
			objStmt.close();
			objCon.close();

			// 出力データ作成用ワーク
			String strOut;
			// XML データの出力ファイル作成
			PrintWriter objFile = new PrintWriter(new FileWriter(args[0]), true);
			// 出力する XML データを作成（XML 宣言）
			strOut = "<?xml version=" + '"' + "1.0" + '"' + " encoding=" + '"' + "UTF-8" + '"' + "?>";
			// 出力する XML データを作成（XML 本文）取得したデータにはルート要素が無いので追加
			strOut = strOut + "<root>" + strXML + "</root>";
			// XML データ出力
			objFile.print(strOut);
			// ファイルクローズ
			objFile.close();
		}
		catch (java.sql.SQLException e) {
			System.err.println("SQLException: " +e.getMessage());
		}
	}

	// ユニコードからシフトJISコードへの変換処理
	static String getUnicodeString( ResultSet rs, int index ) throws SQLException {
		InputStream isr = rs.getBinaryStream( index );
		StringWriter sw = new StringWriter();
		try {
			int	c, d;
			do {
				if( (c = isr.read()) == -1 )	break;
				if( (d = isr.read()) == -1 )	break;
				sw.write( (d&0x00ff)<<8 | (c&0x00ff) );
			} while( true );
			isr.close();
		} catch (IOException e){
			return null;
		}
		return sw.toString();
	}

}
