- PR -

SAX インデントTABを含むXMLが読めない

1
投稿者投稿内容
gocheong
会議室デビュー日: 2005/05/15
投稿数: 4
投稿日時: 2005-12-09 15:53
ttp://www.h7.dion.ne.jp/~matsu/feature/xml/programing/java-sax.html
こちらサイトを参考にしてSAXを使ったXML読み込みプログラムを作りました。
XMLを用意し、実行したところ、データの欠損が40個に1個くらいの割合で発生しました。
いろんなXMLで調査したところ、
原因はXMLの階層に応じ、TABでインデントをいれているのが原因でした。
TABをすべて取り払えさえすれば読めますが、
TABがあってもうまく読める方法はありますでしょうか?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-12-09 16:26
例題は古過ぎませんか
http://www.techscore.com/tech/J2SE/SAX/1.html
くらいに 新しく
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-12-09 22:57
TABがあるからってデータが欠けたりすることはありません。gocheongさんが書いたコードに問題があるのだと思います。

もっと具体的に、コードやデータを示してみてはいかがでしょう。
gocheong
会議室デビュー日: 2005/05/15
投稿数: 4
投稿日時: 2005-12-10 14:38
私の勘違いでした
データが欠損したのは規定バッファサイズ2048バイトを越えるXMLファイルを読み込んだからでした。
TABを消してうまくいったのはたまたまでした。
よって32768バイトまでバッファを増やしました

SAXParser parser = spfactory.newSAXParser();
parser.setProperty("http://apache.org/xml/properties/input-buffer-size", new Integer(32768));

しかし、これでも32Kバイト以上のXMLファイルを読み込むとデータの欠損が発生します。
今回、このXMLファイルは、DBからの検索結果が格納されたXMLであるため、
XMLのファイルサイズに上限を設けることはできません。

検索範囲が大きそうな場合をあらかじめ想定して決めておき、
分けてXMLを取得するなどの工夫が必要なようです。

どうもありがとうございました。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-12-10 15:06
引用:

しかし、これでも32Kバイト以上のXMLファイルを読み込むとデータの欠損が発生します。
今回、このXMLファイルは、DBからの検索結果が格納されたXMLであるため、
XMLのファイルサイズに上限を設けることはできません。

検索範囲が大きそうな場合をあらかじめ想定して決めておき、
分けてXMLを取得するなどの工夫が必要なようです。



そんな必要はありません。

もしかして、XML中の一個のTEXT要素が、必ず1回のcharacters()呼び出しになることを
仮定しておられませんか?
SAXの仕様上、characters()呼び出しはパーザの都合によって任意に分割され得るので、
必要ならばアプリ側で文字列を結合してやる必要があります。

gocheong
会議室デビュー日: 2005/05/15
投稿数: 4
投稿日時: 2005-12-10 23:12
ああ、そういうことですか。確かにそう書いてますね。

ttp://java.sun.com/j2se/1.4/ja/docs/ja/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)

ドキュメントも読まずに勝手な想像をしてしまいました。
すぐ仕様を疑う私は悪い技術者の典型ですね。
すいませんでした。

[ メッセージ編集済み 編集者: gocheong 編集日時 2005-12-10 23:13 ]
1

スキルアップ/キャリアアップ(JOB@IT)