2009-06-15 10 views
6

でXHTML文書を解析している間、私は次のように に移行DTDを使用することを宣言DOCTYPEでHTML文書を解析しようとしています:DTDのダウンロードエラーXOM

<をDOCTYPE用HTML PUBLIC「 - // W3C // DTD! XHTML 1.0過渡// EN」 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

私は、ドキュメントにBuilder.buildを行うと、私は次の例外を取得:

java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1305) 
     at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
     at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) 
     at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source) 
     at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) 
     at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source) 
     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
     at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) 
     at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) 
     at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
     at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
     at nu.xom.Builder.build(Builder.java:1127) 
     at nu.xom.Builder.build(Builder.java:1019) 

私が削除した場合にdoc型の宣言は、それはちょうど良い構文解析します。 私のブラウザから正常にdtdをダウンロードできます。これは、 のURLが有効であることを示しています。私は、doc型宣言を削除したくありません。 ビルダーにdtdをダウンロードしないように指示するか、 に代替dtdを指定する方法がありますか?

+0

あなたは「野生の」からHTMLを解析しているか、あなたが解析しているページを管理している/作成しましたか? – lucas

+0

私は解析しているHTMLを制御しているので、doctype宣言を削除することができます。しかし、私は良い習慣に固執し、doctype宣言を保持しようとしています。 – Bala

答えて

3

Builderのjavadocを見てみると、XMLReaderというコンストラクタを使ってEntityResolverを提供できると思います。可能であれば、パーサーがインターネットからファイルをダウンロードさせないようにします。

+0

org.apache.xerces.parsers.SAXParser xmlReader =新しいSAXParser(); xmlReader.setFeature( "http://apache.org/xml/features/nonvalidating/load-external-dtd"、false); ビルダーxomBuilder =新しいBuilder(xmlReader); – Bala

+7

503が起こった理由:http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Bala

+1

DTDを無効にする代わりに、ダウンロードして私のソフトウェアに組み込みリソースとして追加しました。パーザがそれを望むとき、私はそれをインターネットから取得するのではなく、ローカル/ダウンロード/キャッシュされたDTDのコピーに与えます。これはDTD処理を完全に無効にするよりも優れていると思います。 – ChrisW

7

これは、問題を解決:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      factory.setValidating(false); 
      factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
      Document document = factory.newDocumentBuilder().parse(is);