- PR -

UTF-8のXMLファイルのパースについて

投稿者投稿内容
るな
常連さん
会議室デビュー日: 2006/03/09
投稿数: 21
投稿日時: 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 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-07-19 18:13
おそらくそれはJ2SEに付属のXMLパーサであるcrimsonのバグだと思います。
対応としては、
・メモ帳以外のエディタでBOMなしで保存する
・UTF-8以外のエンコーディングで保存する
・パーサを変える
といったことが考えられます。外部のものはなし、とのことですがパーサは変えられ
ないのでしょうか。
るな
常連さん
会議室デビュー日: 2006/03/09
投稿数: 21
投稿日時: 2006-07-19 18:39
アドバイス有難うございます。

質問に不備がありました...
BOMが入っているUTF-8のXMLをパースする方法として
先頭3byteスキップ以外に良い手段はありますでしょうか?
...が正しかったです。

まだまだ勉強不足(調査中)ですが
上記を満たすライセンスフリーで出所の怪しくないパーサーはあるのでしょうか?
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2006-07-19 18:42
Xerces はどうでしょう?
http://www.atmarkit.co.jp/aig/01xml/xerces.html
UTF-8 のXML を操作してますが、特に問題はありません。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-07-19 19:20
ukさん
>crimsonのバグだと思います。
java.ioが、「UTF-8=BOMなし」と考えているからのような気がします。
BufferedReaderでも、BOMがそのまま読み込まれてゴミになりますので。
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-07-19 19:31
すいません、java を全然知らないんで、外してたらごめんなさい。

読み込み対象に、ストリームを指定できる場合:
 ストリームのクラスを継承して、最初の2バイトを Open の時に捨てる
 ストリームクラスを作る

読み込み対象に、ファイル名を指定できる場合:
 parser を継承して、最初に BOM を消したデータで、テンポラリファイルを
 作成して、そこから読み込ませる。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-07-19 20:07
SunのJDK1.5ではXercesが内蔵されているくらいですので、
決してXercesはあやしいパーサではありません。

<java-home>/lib/endorsedにxercesのjarを配置すればすぐに使えるはずです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-07-19 20:15
引用:

まだまだ勉強不足(調査中)ですが
上記を満たすライセンスフリーで出所の怪しくないパーサーはあるのでしょうか?


他の人からも推薦が入っていますが、Apache Xercesを使いましょう。実際のシステム
開発ではデファクトスタンダードと言ってもいいと思います。

引用:

mioさんの書き込み (2006-07-19 19:20) より:
ukさん
>crimsonのバグだと思います。
java.ioが、「UTF-8=BOMなし」と考えているからのような気がします。
BufferedReaderでも、BOMがそのまま読み込まれてゴミになりますので。


ストリームならそのまま読み込むのは当然ですよね。
ソースを読んだわけではないので推測ですが、XMLパーサならストリームで読むと思う
(XML宣言読まないとエンコーディングが不明だから)ので、Reader系の動作は関係ない
んじゃないですかね。

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