- - PR -
UTF-8のXMLファイルのパースについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-19 17:07
お世話になっております。
Windowsのメモ帳等でUTF-8で保存したXMLを javax.xml.parsers.SAXParser.parse() を使用してパースすると 「ドキュメントのルート要素がありません。」とエラーになります。 調べた所、ファイルの先頭に「Byte Order Mark」なる3byteが入っています。 Streamを3byteスキップしてパーサーに渡す以外に解決策が見当たりませんでした。 何か良い手段はありますでしょうか? ※外部の物は無しお願いします。 【環境】 ・WinXP ・java(j2sdk1.4.2_9) [ メッセージ編集済み 編集者: るな 編集日時 2006-07-19 17:10 ] | ||||||||
|
投稿日時: 2006-07-19 18:13
おそらくそれはJ2SEに付属のXMLパーサであるcrimsonのバグだと思います。
対応としては、 ・メモ帳以外のエディタでBOMなしで保存する ・UTF-8以外のエンコーディングで保存する ・パーサを変える といったことが考えられます。外部のものはなし、とのことですがパーサは変えられ ないのでしょうか。 | ||||||||
|
投稿日時: 2006-07-19 18:39
アドバイス有難うございます。
質問に不備がありました... BOMが入っているUTF-8のXMLをパースする方法として 先頭3byteスキップ以外に良い手段はありますでしょうか? ...が正しかったです。 まだまだ勉強不足(調査中)ですが 上記を満たすライセンスフリーで出所の怪しくないパーサーはあるのでしょうか? | ||||||||
|
投稿日時: 2006-07-19 18:42
Xerces はどうでしょう?
http://www.atmarkit.co.jp/aig/01xml/xerces.html UTF-8 のXML を操作してますが、特に問題はありません。 | ||||||||
|
投稿日時: 2006-07-19 19:20
ukさん
>crimsonのバグだと思います。 java.ioが、「UTF-8=BOMなし」と考えているからのような気がします。 BufferedReaderでも、BOMがそのまま読み込まれてゴミになりますので。 | ||||||||
|
投稿日時: 2006-07-19 19:31
すいません、java を全然知らないんで、外してたらごめんなさい。
読み込み対象に、ストリームを指定できる場合: ストリームのクラスを継承して、最初の2バイトを Open の時に捨てる ストリームクラスを作る 読み込み対象に、ファイル名を指定できる場合: parser を継承して、最初に BOM を消したデータで、テンポラリファイルを 作成して、そこから読み込ませる。 | ||||||||
|
投稿日時: 2006-07-19 20:07
SunのJDK1.5ではXercesが内蔵されているくらいですので、
決してXercesはあやしいパーサではありません。 <java-home>/lib/endorsedにxercesのjarを配置すればすぐに使えるはずです。 | ||||||||
|
投稿日時: 2006-07-19 20:15
他の人からも推薦が入っていますが、Apache Xercesを使いましょう。実際のシステム 開発ではデファクトスタンダードと言ってもいいと思います。
ストリームならそのまま読み込むのは当然ですよね。 ソースを読んだわけではないので推測ですが、XMLパーサならストリームで読むと思う (XML宣言読まないとエンコーディングが不明だから)ので、Reader系の動作は関係ない んじゃないですかね。 |