1

XML を解析しようとすると、次の例外が発生します。

org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: not well-formed (invalid token)

主な問題は、これが Android 2.2 または 2.3 デバイスでのみ発生したことですが、最も奇妙なことは、最初に応答を解析するときは問題ありませんが、その後のすべての試行で解析例外が発生することです。

私のコードは次のとおりです。

        URL url = new URL("http://m.ideasmusik.com/rss/?ct=mx");
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        //InputSource is = new InputSource("http://m.ideasmusik.com/rss/?ct=mx");
        //is.setEncoding(HTTP.UTF_8);   

        // Parse content
        MusicRSSParser parser = new MusicHandler.MusicRSSParser(); //DefaultHandler
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(parser);
        InputSource in = new InputSource(url.openStream());//is.getByteStream());
        in.setEncoding(HTTP.UTF_8);
        xr.parse(in);

XML は UTF-8 です (エンコーディングが正しくないことが一般的な問題であると読んだことがあります)。

何がうまくいかないのか推測できますか?ハンドラーに問題がある可能性があると思いましたが、ロジックが適用される前に、startDocument()メソッドの直後にクラッシュします。

同じ結果で、InputStream の代わりに Url を試しました。

編集

アプリケーション管理に移動してアプリ キャッシュを消去すると、初めて問題なく動作します。解析にどのように影響しますか??

4

2 に答える 2

0

しかし、最も奇妙なことは、応答を初めて解析するときは問題ないことですが、その後のすべての試行で解析例外が発生します

私も同じ問題を抱えていました。これは、一部のデバイス (Samsung Galaxy S2 など) で発生し、Android 2.3 だけでなく、それ以降でも発生します。たとえば、Galaxy S2 (4.4.2) では発生しますが、エミュレータ (4.4.2) では発生しません。問題はおそらくリクエストのキャッシュにあります。XML を含む 2 番目の要求文字列が書き込まれ、エンコードされた文字が間違って再度読み取られた後。

私は(多くの作業の後;))接続に単純な setUseCaches(false) を追加することで私の問題を解決しました:

    URLConnection conn = url.openConnection();
    conn.setUseCaches(false);
于 2017-05-06T11:48:41.687 に答える