5

私はこの機能を持っています:

private Node getDOM(String str) throws SearchEngineException {

                DOMResult result = new DOMResult();

                try {
                        XMLReader reader = new Parser();
                        reader.setFeature(Parser.namespacesFeature, false);
                        reader.setFeature(Parser.namespacePrefixesFeature, false);
                        Transformer transformer = TransformerFactory.newInstance().newTransformer();
                        transformer.transform(new SAXSource(reader,new InputSource(new StringReader(str))), result);
                } catch (Exception ex) {
                        throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage());
                }

                return result.getNode();
        }

POSTリクエストの後にhttpサーバーから送信されたhtmlドキュメントを含む文字列を取りますが、適切に解析できません.ドキュメント全体から4つのノードしか得られません. 文字列自体は問題ないように見えます。印刷してテキスト ドキュメントにコピーすると、期待どおりのページが表示されます。

上記のメソッドのオーバーロードされたバージョンを使用すると:

private Node getDOM(URL url) throws SearchEngineException {

                DOMResult result = new DOMResult();

                try {
                        XMLReader reader = new Parser();
                        reader.setFeature(Parser.namespacesFeature, false);
                        reader.setFeature(Parser.namespacePrefixesFeature, false);
                        Transformer transformer = TransformerFactory.newInstance().newTransformer();
                        transformer.transform(new SAXSource(reader, new InputSource(url.openStream())), result);
                } catch (Exception ex) {
                        throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage());
                }

                return result.getNode();
        }

その後、すべてが正常に機能します-適切なDOMツリーを取得しますが、サーバーからPOST回答を何らかの方法で取得する必要があります.

文字列をファイルに保存して読み戻すことはできません - それでも同じ結果が得られます。

何が問題なのですか?

4

3 に答える 3

1

xmlエンコーディングに問題があるのでしょうか?

于 2010-03-03T22:23:55.810 に答える
1

これはエンコードの問題のようです。動作しないコード例では、url を文字列としてコンストラクターに渡し、それを systemId として使用し、Tagsoup で html を解析する際に問題が発生します。動作する例では、ストリームを InputSource コンストラクターに渡しています。違いは、ストリームを渡すと、SAX 実装がストリームからエンコーディングを判断できることです。

これをテストしたい場合は、次の手順を試すことができます。

  • java.io.InputStreamReader を介して解析している html をストリーミングし、それに対して getEncoding を呼び出して、検出されたエンコーディングを確認します。
  • 最初のコード例では、inputStreamReader が報告したエンコーディングを渡す InputSource で setEncoding を呼び出します。
  • エンコーディングを明示的に設定するように変更された最初の例が、html を正しく解析するかどうかを確認してください。

これについては、SAX InputSource の使用に関する記事の最後に議論があります。

于 2010-03-04T16:06:46.040 に答える
0

POST 応答を取得するには、最初に POST 要求を実行する必要があります。new InputSource(url.openStream())おそらく、接続を開き、GET 要求から応答を読み取ります。URL を使用した POST リクエストの送信 を確認してください。

POST リクエストを実行して応答を取得するためにチェックアウトするのに興味深い可能性があるその他の可能性:

于 2010-02-26T22:24:23.400 に答える