【Java】SAXで大きなファイルをパースするときに

XMLをSAXでパースするときに
予期せぬバグに遭遇したのでその備忘録.

バグの内容は
Yamada
のテキスト"Yamada"を取得するときに
Yam ada
であるかのような結果がでた.

原因箇所を探ったところ,
DefaultHandlerのcharactersメソッドにあることが判明.
charactersメソッドのch[]が途中で切れていた.

"Yamada"の場合だと
ch [97]='Y' [98]='a' [99]='m'
ch [00]='a' [01]='d' [02]='a'

これはバッファとして確保されているchのサイズ以上の
ファイルを扱おうとして再度読み込みすることで
テキストが途切れていた.
バッファchのサイズはsetPropertyメソッドで設定するが
それ以上のサイズを扱う場合はプログラマがテキストを
繋ぎ合わせる処理を書く必要がある.


私の場合は,charactersメソッドでStringBuilderにテキスト
をappendで繋ぎ合わせ,エンドタグの処理直前でテキスト部分の
処理を行うことで対処した.

参考ページ:
SAXで利用する、ContentHandler.charactersメソッドの注意点