April 07, 2012

JavaでXMLをパースするとき、DTDを取得しようとしてエラーになる問題

JavaでXMLをパースするとき、標準ライブラリのDOMとかSAXとかのパーサを利用できますが、ネットワーク関連のエラーでパースに失敗することがあります。

パース対象のXMLにDOCTYPEで外部のDTDファイルが指定されていると、指定されているURLからDTDファイルを取得しようとするのが原因です。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
上記だと、「http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd」に接続しようとしてエラーになります。

この機能を無効にできないものか。

調べたところ、DocumentBuilderFactoryまたはSAXParserFactoryで以下のように指定すると、外部DTDの取得を無効にできるようです。
SAXParserFactory factory = SAXParserFactory.newInstance();
 factory.setFeature( "http://apache.org/xml/features/nonvalidating/load-external-dtd", false ) ;
ほかにも、EntityResolverを自分で実装して、ローカルファイルを読ませる方法なんかもあるようですが、こっちのが楽かと。

setFeatureで切り替えられるその他の機能は以下

http://xerces.apache.org/xerces-j/features.html


matssaku at 14:43│Comments(0)TrackBack(0)clip!Java 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔