- PR -

byte型からのDocumentオブジェクトの生成について

1
投稿者投稿内容
ebi
会議室デビュー日: 2007/08/21
投稿数: 7
投稿日時: 2007-10-02 09:55
こんにちわ。

byte型変数にxml形式のデータが設定されており、
そのxml形式の中のタグを指定して値を抜きたいと思っています。
Documentオブジェクトを使用して抜けるものと思ってましたが上手くいきません。

下記のようにやってみたのですが、
xml中のDOCTYPE宣言で指定したdtdファイルを読もうとしてFileNotFoundExceptionが発生します。

------------------------------------------------------------------------------------------

byte[] bXml; // xml形式のデータで初期化される

DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfactory.newDocumentBuilder();
Document doc = builder.parse( new InputSource( new ByteArrayInputStream( bXml ) ) );

------------------------------------------------------------------------------------------

byte型からDocumentオブジェクトを生成するやり方はあるのでしょうか?
宜しくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-10-02 11:34
DTDエラーがでるというのは、既に読み込まれているからです。
DTDが物理的に取得できない環境にあるのであれば、
DTD検証を無効にしてみてはいかがでしょうか。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/xml/parsers/DocumentBuilderFactory.html#setValidating(boolean)
ebi
会議室デビュー日: 2007/08/21
投稿数: 7
投稿日時: 2007-10-02 14:08
かつのりさん、返信ありがとうございます。

リンク先のURLを参考にDTD検証を無効にするようにしてみましたが、
それでもFileNotFoundExceptionが発生しました。

setValidatingを指定してもファイル参照は行うのならエラーは納得できます。

コードの修正は下記のように行いました。

------------------------------------------------------------------------------------------

byte[] bXml; // xml形式のデータで初期化される

DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
dbfactory.setValidating( false );

DocumentBuilder builder = dbfactory.newDocumentBuilder();
Document doc = builder.parse( new InputSource( new ByteArrayInputStream( bXml ) ) );

------------------------------------------------------------------------------------------
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-10-02 14:13
ん〜、具体的に何が起こっているのかコードだけ見せられても、
FileNotFoundExceptionだといわれても分からないのですよ。

せめてスタックトレースの内容とかJDKのバージョンとか教えてくださいよ。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-10-02 14:55
DTD の中に実体参照の定義があるかもしれないので、XML パーザとしては validation 無しでも DTD を読む必要があります。

ですので、DTD をお持ちならばそれを読ませる方向で解決できますし、実体参照がないなどで DTD なしでもパースできるならばトリックを使って DTD なしで済ませる解決方法があります。DocumentBuilder.parse(InputStream, String) や DocumentBuilder.setEntityResolver(EntityResolver) を使います。

1

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