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のようです-それが役に立った場合)。