- PR -

SAXParserの挙動について

1
投稿者投稿内容
Sin5
会議室デビュー日: 2004/04/01
投稿数: 5
お住まい・勤務地: 東京
投稿日時: 2005-05-16 15:40
添付したコードでXMLファイルを処理すると、まれに1つのテキストデータに対して2回charactersメソッドが呼び出されることがあります

例:参考1にあるデータの場合
<root>
<data>あいうえお</data>
</root>

このようなデータのときに

あいう       <= charactersメソッド1回目
えお        <= charactersメソッド1回目

と出力される
(実際にはもっと大きなファイルでないと発生しません)

おそらくパーサ内のバッファの切り替えによって発生するのだと思われますが、このようにテキストデータが分割される可能性があるという説明を見出すことができませんでした

参考1:http://www.atmarkit.co.jp/fxml/rensai/xmljava04/xmljava02.html
分割について記述なし

参考2:http://sdc.sun.co.jp/java/techarticles/jax/Rev3/jax_jaxp_03.html
こちらも分割について記述なし
ここで紹介されているSAXAPIのサンプルでは"Mocha Java"というテキストデータが分割される可能性があるので、場合によっては意図したとおりに動かないような気がします


現在、分割されて取得が行われることを前提に作業を進めているのですが、確認の意味でこの挙動について説明した情報を探しています
何か情報がありましたら教えていただけないでしょうかよろしくお願いします

コード:
import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.helpers.DefaultHandler;

public class test extends DefaultHandler{

	public static void main(String[] args) throws Exception{
		SAXParserFactory spfactory = SAXParserFactory.newInstance();
		SAXParser parser = spfactory.newSAXParser();
		test handler = new test();
		parser.parse(new File("data.xml"),handler);
		System.out.println(System.getProperties());

	}

	public void characters(char[] ch, int offset, int length){
		String text = String.valueOf(ch, offset, length);
		if(text.trim().length() != 0)
			System.out.println(text);
	}
}



けむ
常連さん
会議室デビュー日: 2003/09/26
投稿数: 40
投稿日時: 2005-05-16 17:05
単純に、「分割についての記述」という意味でなら、javadocに記述があります。
「なぜ分割されるのか?」という意味であれば、実装依存になるのではないでしょうか?
Sin5
会議室デビュー日: 2004/04/01
投稿数: 5
お住まい・勤務地: 東京
投稿日時: 2005-05-16 17:57
レスありがとうございます

DefaultHandler、SAXParserに目が行ってしまい、そのインターフェイスの確認を失念していました

ContentHandlerインターフェイスのcharactersメソッドの説明に
SAX パーサは、連続する文字データを単一のチャンクとして、またはいくつかのチャンクに分割して返します
との記述を確認しました

チャンクという言葉の正確な意味をつかみかねていますが、パース時の挙動については確認できました

ありがとうございました
1

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