AOJXMLtoCSV@Java

AOJのAPIからダウンロードしたxmlファイルをCSV形式に変換するプログラムです。ターミナルやコマンドプロンプトにより、.dbファイルに読み込む事が出来ます。

```java:
package Homework;
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.util.*;

public class AOJXMLtoCSV extends DefaultHandler {
	Stack<String> elementStack = new Stack<String>();     //ユーザー判定用のスタック
	ArrayList<String> contents = new ArrayList<String>(); //カラムを格納

	@Override
	public void startDocument() {//デフォルトでは何も行わない。以下同文
		//文書開始時の処理
		elementStack = new Stack<String>();  //elementStackのインスタンス初期化
	}

	@Override
	public void endDocument() { //デフォルトでは何もしない。以下同文。
		System.out.println("処理完了");
	}

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) {//でフォルトでは何も行わないが、オーバーライドして処理を記述する。
		//要素開始時の処理
		//System.out.println("Start Element = " + uri + "," + localName + "," + qName + "," + attributes);
		elementStack.push(qName);//要素名をスタックにプッシュ
		//深さ２の<status>要素を開始時に内容リストを初期化
		//(次のユーザー情報の処理にとりかかる)
		if(qName.equals("user") && elementStack.size() == 2) {
			contents = new ArrayList<String>(); //contentsのインスタンス初期化
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName) { //デフォルトでは何も行わないが、オーバーライドして処理を記述する
		//要素終了時の処理
		//System.out.println("End Element = " + uri + "," + localName + "," + qName);
		//深さ２の</status>の時に出力
		if(elementStack.size() == 2) {
			String topElement = elementStack.peek(); //スタックの先頭にある要素をtopElementに代入
			if(topElement.equals("user")) {          //その要素がuserならば
				//System.out.println(contents);
				
				for(int r = 0; r < contents.size(); r++) {//コンテンツの要素全て分だけ
					if(r > 0) System.out.print(','); //delimiter(区切り記号)を間に挟む
					System.out.print(contents.get(r)); //コンテンツの要素を出力
				}
				System.out.println(); //レコード終了
			}
		}
		elementStack.pop();//先頭オブジェクトを削除する。返り値として削除したオブジェクトが返ってくる
	}

	@Override
	public void characters(char[] ch, int offset, int length) {//でフォルトでは何も行わない。以下同文。
		//深さ３の要素の内容を出力する(run_idやproblem_id等)
		//最初と最後の改行を削除する trim()
		if(elementStack.size() == 3)
			contents.add(new String(ch, offset, length).trim());
	}

	public static void main(String[] args) {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			parser.parse(new File("user_list.xml"), new AOJXMLtoCSV());
		} catch(Exception e) {// IllegalArgumentException、IOException、SAXExceptionのキャッチ
			System.out.println("ああああ");
			e.printStackTrace();//このスロー可能オブジェクトおよびそのバックトレースを標準エラーストリームに出力する
		}
	}

}

```

JAVA APIリファレンスから、xmlファイルに対して処理するためのクラス、SAXParserFactory、SaxParserについて持ってきました。良かったら参考にしてください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
SAXParserFactory.newInstance()
public static SAXParserFactory newInstance()
SAXParserFactory の新しいインスタンスを取得します。この static メソッドは新しいファクトリインスタンスを作成します。 このメソッドは次の順序の検索手順で、ロードする SAXParserFactory 実装クラスを決定します。
javax.xml.parsers.SAXParserFactory システムプロパティーを使用する
JRE ディレクトリ内のプロパティーファイル lib/jaxp.properties を使用する。この構成ファイルは標準の java.util.Properties 形式であり、上記のように定義されたシステムプロパティーであるキーを持つ実装クラスの完全指定の名前を含む。 jaxp.properties ファイルは JAXP 実装によって 1 回だけ読み込まれ、その値がその後の使用のためキャッシュされる。最初の読み込み時にファイルが存在しないと、そのあとにその存在がチェックされることは ない。最初に読み込まれたあと、jaxp.properties のプロパティーの値を変更することはできない。
可能であれば、JAR 仕様で詳細に説明されているサービス API を使用して、クラス名を判定する。Services API は、実行時に使用できる jar 内の META-INF/services/javax.xml.parsers.SAXParserFactory ファイルからクラス名を検索する
プラットフォームのデフォルトの SAXParserFactory インスタンス
アプリケーションが SAXParserFactory への参照を取得すると、ファクトリを使用してパーサーのインスタンスを設定および取得することができます。
トラブルシューティングのヒント

 
jaxp.debug システムプロパティーを設定すると、このメソッドは実行中の処理や検索している場所に関する大量のデバッグメッセージを System.err に出力します。

 
DocumentBuilder のロードに問題がある場合、次のようにします。

 
 java -Djaxp.debug=1 YourProgram ....
 
戻り値:
SAXParserFactory の新しいインスタンス
例外:
FactoryConfigurationError - 実装が使用できないか インスタンス化できない場合
newInstance

public static SAXParserFactory newInstance(String factoryClassName,
                                           ClassLoader classLoader)
 
SAXParserFactory の新しいインスタンスをクラス名から取得します。この関数は、クラスパスに複数のプロバイダがある場合に便利です。どのプロバイダがロードされるかを指定できるため、アプリケーションをさらに制御できます。

 
アプリケーションが SAXParserFactory への参照を取得すると、ファクトリを使用してパーサーのインスタンスを設定および取得することができます。

トラブルシューティングのヒント

 
jaxp.debug システムプロパティーを設定すると、このメソッドは実行中の処理や検索している場所に関する大量のデバッグメッセージを System.err に出力します。

 
問題がある場合、次のようにします。

 
 java -Djaxp.debug=1 YourProgram ....
 
パラメータ:
factoryClassName - javax.xml.parsers.SAXParserFactory の実装を提供する、完全指定のファクトリクラス名
classLoader - ファクトリクラスのロードに使用される ClassLoader。null の場合は、現在の Thread のコンテキスト classLoader が、ファクトリクラスのロードに使用される
戻り値:
SAXParserFactory の新しいインスタンス
例外:
FactoryConfigurationError - factoryClassName が null、または、 ファクトリクラスがロード、インスタンス化できない場合。
導入されたバージョン:
1.6
関連項目:
newInstance()
SAXParserFactory.newSAXParser()
public abstract SAXParser newSAXParser()
                                throws ParserConfigurationException,
                                       SAXException
 
現在設定されているファクトリパラメータを使用して SAXParser の新しいインスタンスを作成します。

戻り値:
SAXParser の新しいインスタンス
例外:
ParserConfigurationException - 要求された構成を満たすパーサーを生成できない場合
SAXException - SAX エラーの場合
SAXParser.parse
 parse

public void parse(InputStream is,
                  HandlerBase hb)
           throws SAXException,
                  IOException
 
指定された InputStream インスタンスのコンテンツを、指定された HandlerBase を使用して XML として構文解析します。HandlerBase クラスは SAX 2.0 では推奨されないので、このメソッドの DefaultHandler バージョンを使用することをお勧めします。

パラメータ:
is - 構文解析されるコンテンツを含む InputStream
hb - 使用する SAX HandlerBase
例外:
IllegalArgumentException - 指定された InputStream が null の場合
SAXException - 構文解析で SAX エラーが生成された場合
IOException - InputStream とのやりとりで 入出力エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(InputStream is,
                  HandlerBase hb,
                  String systemId)
           throws SAXException,
                  IOException
 
指定された InputStream インスタンスのコンテンツを、指定された HandlerBase を使用して XML として構文解析します。HandlerBase クラスは SAX 2.0 では推奨されないので、このメソッドの DefaultHandler バージョンを使用することをお勧めします。

パラメータ:
is - 構文解析されるコンテンツを含む InputStream
hb - 使用する SAX HandlerBase
systemId - 相対 URI を解決するのに必要なシステム識別子
例外:
IllegalArgumentException - 指定された InputStream が null の場合
IOException - InputStream とのやりとりで 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
代わりのこのメソッドのバージョン
parse

public void parse(InputStream is,
                  DefaultHandler dh)
           throws SAXException,
                  IOException
指定された InputStream インスタンスのコンテンツを、指定された DefaultHandler を使用して XML として構文解析します。
パラメータ:
is - 構文解析されるコンテンツを含む InputStream
dh - 使用する SAX DefaultHandler
例外:
IllegalArgumentException - 指定された InputStream が null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(InputStream is,
                  DefaultHandler dh,
                  String systemId)
           throws SAXException,
                  IOException
指定された InputStream インスタンスのコンテンツを、指定された DefaultHandler を使用して XML として構文解析します。
パラメータ:
is - 構文解析されるコンテンツを含む InputStream
dh - 使用する SAX DefaultHandler
systemId - 相対 URI を解決するのに必要なシステム識別子
例外:
IllegalArgumentException - 指定された InputStream が null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
代わりのこのメソッドのバージョン
parse

public void parse(String uri,
                  HandlerBase hb)
           throws SAXException,
                  IOException
指定された URI (Uniform Resource Identifier) で表わされたコンテンツを、指定された HandlerBase を使用して XML として構文解析します。HandlerBase クラスは SAX 2.0 では推奨されないので、このメソッドの DefaultHandler バージョンを使用することをお勧めします。
パラメータ:
uri - 構文解析されるコンテンツの場所
hb - 使用する SAX HandlerBase
例外:
IllegalArgumentException - uri が null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(String uri,
                  DefaultHandler dh)
           throws SAXException,
                  IOException
指定された URI (Uniform Resource Identifier) で表わされたコンテンツを、指定された DefaultHandler を使用して XML として構文解析します。
パラメータ:
uri - 構文解析されるコンテンツの場所
dh - 使用する SAX DefaultHandler
例外:
IllegalArgumentException - uri が null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(File f,
                  HandlerBase hb)
           throws SAXException,
                  IOException
指定されたファイルのコンテンツを、指定された HandlerBase を使用して XML として構文解析します。 HandlerBase クラスは SAX 2.0 では推奨されないので、このメソッドの DefaultHandler バージョンを使用することをお勧めします。
パラメータ:
f - 構文解析対象の XML を含むファイル
hb - 使用する SAX HandlerBase
例外:
IllegalArgumentException - File オブジェクトが null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(File f,
                  DefaultHandler dh)
           throws SAXException,
                  IOException
指定されたファイルのコンテンツを、指定された DefaultHandler を使用して XML として構文解析します。
パラメータ:
f - 構文解析対象の XML を含むファイル
dh - 使用する SAX DefaultHandler
例外:
IllegalArgumentException - File オブジェクトが null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(InputSource is,
                  HandlerBase hb)
           throws SAXException,
                  IOException
指定された InputSource のコンテンツを、指定された HandlerBase を使用して XML として構文解析します。 HandlerBase クラスは SAX 2.0 では推奨されないので、このメソッドの DefaultHandler バージョンを使用することをお勧めします。
パラメータ:
is - 構文解析されるコンテンツを含む InputSource
hb - 使用する SAX HandlerBase
例外:
IllegalArgumentException - InputSource オブジェクトが null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler
parse

public void parse(InputSource is,
                  DefaultHandler dh)
           throws SAXException,
                  IOException
指定された InputSource のコンテンツを、指定された DefaultHandler を使用して XML として構文解析します。
パラメータ:
is - 構文解析されるコンテンツを含む InputSource
dh - 使用する SAX DefaultHandler
例外:
IllegalArgumentException - InputSource オブジェクトが null の場合
IOException - 入出力エラーが発生した場合
SAXException - 処理中に SAX エラーが発生した場合
関連項目:
DocumentHandler