- PR -

SAXのDefaultHandler.charactersメソッドを使って

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/02/12
投稿数: 3
投稿日時: 2006-05-30 10:47
はじめまして
私は現在XML文を読み込んで動作するアプリケーションをつくりました。
その際、SAXをつかってXML文の解析をおこない、ほぼ完成に至ったのですが、
 /**
* テキストデータ読み込み時
*/
public void DefaultHandler.characters(char[] ch,int offset,int length) {
System.out.println("テキストデータ:" + new String(ch, offset, length));
}
を使うと、ごくまれに、文章が切れてしまい2行になるということがおこります。
正常な時と、2行になってしまうときの差がわからないため対策を立てれずにいます。
どなたかご存知ないでしょうか。
けむ
常連さん
会議室デビュー日: 2003/09/26
投稿数: 40
投稿日時: 2006-05-30 11:37
javadocを参照すれば分かりますが、そもそもそういう仕様です。
従って、SAXの実装次第になるのではないでしょうか?
未記入
会議室デビュー日: 2004/02/12
投稿数: 3
投稿日時: 2006-05-31 03:29
javadocは何度も参照しました。
XML文の間隔を変えることで、回避できるのもわかっていますが、
私としては、XMLの文章を直さなくても、動くアプリケーションにしたのです。
憶測ですが、けむさんはSAXを使ったアプリケーションをされた経験がないのでは?
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2006-05-31 07:33
この会議室の
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26746&forum=12
あたりが参考になるかと思います。

>憶測ですが、けむさんはSAXを使ったアプリケーションをされた経験がないのでは?
こういった表現は、せっかく回答を頂いた方に対して失礼かなと。
読んでいて、あまり気持ちのいいものではないですね。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-05-31 10:12
このへんの挙動を設定できるパーザというのも見たことがありませんので、未記入さんのコードで対処する必要があります。連続して来たcharacters()呼び出しをまとめるだけですから、30分もあれば対処できると思いますよ。

古い本ですが『XMLとJavaによるWebアプリケーション開発 第2版』に、characters()をまとめるためのSAXフィルタのコードが載ってたと思います。
けむ
常連さん
会議室デビュー日: 2003/09/26
投稿数: 40
投稿日時: 2006-05-31 10:59
「正常な時と、2行になってしまうときの差」を質問していたので、実装依存である、つまり、知っていも意味がない、と答えたつもりでした。

そのことを前提とすると、何回charactersが呼ばれても大丈夫なように実装すればよいだけではないですか?

[ メッセージ編集済み 編集者: けむ 編集日時 2006-05-31 11:00 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-05-31 20:59
charactersが複数回に分けて呼ばれるのは仕方がありませんので、

1.StringBufferをフィールドで用意(char配列を格納できるようなものなら何でもよい)
2.charactersが呼ばれたら、char配列を1のインスタンスに格納する
3.characters以外が呼ばれたら、1のインスタンスからフラッシュする

という感じで実装すると、1つの塊で扱う事ができます。
1つの塊にできる=オンメモリであるという事に注意する必要があります。
未記入
会議室デビュー日: 2004/02/12
投稿数: 3
投稿日時: 2006-06-01 00:24
けむさんへ、大変失礼なことを言って申し訳ありませんでした。

かつのりさんの、助言どうり、charactersメソッドでは、StringBufferの追加ので、endElementメソッドで登録の流れで、問題が解決しました。

かつのりさん、他皆様、ありがとうございました。
1

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