0

java.io.InputStreamを返すことからXHTMLドキュメントをロードするこのメソッドがありますorg.w3c.dom.Document

private Document loadDocFrom(InputStream is) throws SAXException,
        IOException, ParserConfigurationException {
    DocumentBuilderFactory domFactory = DocumentBuilderFactory
            .newInstance();
    domFactory.setNamespaceAware(true); // never forget this
    DocumentBuilder builder = domFactory.newDocumentBuilder();

    Document doc = builder.parse(is);
    is.close();
    return doc;
}

この方法は機能します。いくつかのXHTMLドキュメント(例http://pastebin.com/L2kHwggU)とXHTMLWebサイトでテストしました。

ただし、このhttp://pastebin.com/v675yWSJやのようなWebサイトなどの一部のドキュメントwww.w3.orgでは、で無限ループに入りますDocument doc = builder.parse(is);

編集:

@Michael Kayは問題を発見しましたが、私は彼の解決策を待っています。

他の可能な解決策の1つは、DTDを無視することです。

domFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)

ご協力ありがとうございました。

4

1 に答える 1

1

無限ループだというあなたの診断は間違っていると思います。非常に長い時間がかかるだけですが、同じことではありません。

これの通常の理由は、ドキュメントにW3CWebサイトのXHTMLDTDへの参照が含まれており、パーサーがローカルコピーを使用するのではなく、これをフェッチするためにWebにアクセスするためです。W3Cは、約1年前に、これらの一般的なDTDの「スロットリング」要求を開始しました。これは、これらのDTDがトラフィックの量を処理できなくなったためです。

通常の解決策は、Resolverを使用してリクエストをローカルコピーにリダイレクトすることです。

于 2012-05-24T07:14:50.850 に答える