4

DOMパーサーを使用したDOCTYPE宣言でxhtmlを解析する際に問題が発生します。

エラー:java.io.IOException:サーバーがHTTP応答コードを返しました:URLの503: http ://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%20

宣言:DOCTYPE html PUBLIC "-// W3C // DTD XHTML 1.0 Transitional // EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

DOCTYPE宣言を無視してxhtmlをDocumentオブジェクトに解析する方法はありますか?

4

4 に答える 4

4

私にとって有効な解決策は、DocumentBuilderに空のストリームを返す偽のリゾルバーを与えることです。ここに良い説明があります(kdgregoryからの最後のメッセージを見てください)

http://forums.sun.com/thread.jspa?threadID=5362097

これがkdgregoryのソリューションです:

documentBuilder.setEntityResolver(new EntityResolver()
        {
            public InputSource resolveEntity(String publicId, String systemId)
                throws SAXException, IOException
            {
                return new InputSource(new StringReader(""));
            }
        });
于 2010-07-30T14:28:57.437 に答える
1

DTDをダウンロードするにはパーサーが必要です<?xml... ?>が、回線にスタンドアロン属性を設定することで回避できます。

ただし、この特定のエラーは、XMLスキーマ定義とDTDURLの間の混乱によって引き起こされる可能性が高いことに注意してください。詳細については、 http://www.w3schools.com/xhtml/xhtml_dtd.aspを参照してください。正しいものは次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
于 2010-04-14T20:35:07.390 に答える
1

最も簡単な方法は、DocumentBuilderFactoryでvalidating=falseを設定することです。検証を行う場合は、DTDをダウンロードして、ローカルコピーを使用してください。上記のレイチェルがコメントしたように、これはWWWコンソーシアムで議論されています。

つまり、デフォルトのDocumentBuilderFactoryは検証するたびにDTDをダウンロードするため、一般的なプログラマーがJavaでXHTMLファイルを解析しようとするたびにW3がヒットしていました。彼らはそれほど多くのトラフィックを買う余裕がないので、エラーで応答します。

于 2010-07-27T16:56:35.780 に答える
1

偽のリゾルバーの代わりに、次のコードスニペットは、DOCTYPE宣言からの外部DTDを実際に無視するようにパーサーに指示します。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

(...)

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
f.setValidating(false);
f.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder builder = f.newDocumentBuilder();
Document document = builder.parse( ... )
于 2016-09-18T15:49:00.507 に答える