0

XMLドキュメントに対してオンラインでXPathクエリを実行したいのですが。コンテンツを取得し、HTTPリクエストのフィールドに<?xml ...?>存在するエンコーディングを宣言するヘッダーを追加するInputStreamsを設定しました。charsetそれは動作しますが、痛々しいほど遅いです。

    //bis is the BufferedInputStream with the content part of the HTTP reply
docBuilder = docBuilderFactory.newDocumentBuilder(); // throws exception.
Document doc = docBuilder.parse
    (new PrependInputStream(bis,
                "<?xml version='1.0' encoding='"+charset+"' ?>\r\n"));

(今回はソース全体を入れないようにしてください。学生向けの課題を準備しています)。

いくつかのstrace分析により、w3.orgに接続するとプログラムが停止することが明らかになりました。

 send(8, "GET /TR/xhtml1/DTD/xhtml1-transitional.dtd HTTP/1.1\r\nUser-Agent: Java/1.6.0_17\r\nHost: www.w3.org\r\nAccept: 
      text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\nConnection: keep-alive\r\n\r\n", 186, 0)
 recv(8, ...

HTMLコンテンツが有効であるかどうかについてあまり心配しないので(整形式で十分なはずです)、試しdocBuilderFactory.setValidating(false) ましたが、DTDのオンライン取得を妨げることはないようです。

手動で取得した同じdtdファイルを使用してスキーマを手動で設定しようとするとdocBuilderFactory.setSchema()、「org.xml.sax.SAXParseException:ルート要素の前にあるドキュメントのマークアップは整形式である必要があります。」(これはお勧めできません)

私はどこで物事を複雑にしすぎていますか?

(スタックトレースからわかる限り、XMLバックエンドはcom.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchemaのようです-それが役に立った場合)。

4

1 に答える 1

0

HTML dtdは巨大で、インクルードを使用しています。そして、あなたは正しいです、彼らは永遠にかかります。XMLカタログを使用します。そこで、dtdsをローカルに保存し、システムIDでマップすることができます。

Mavenなどのツールを使用すると、十分なポインターが見つかります。

@sylvainulgによってリンクされた答えが示唆するように、エンティティをインターセプトすることの利点は、正しい文字を受け取ることです。

于 2013-02-07T14:15:16.530 に答える