【问题标题】:Android - SaxParser error: ParseException: At line 1, column 0: not well-formed (invalid token)Android - SaxParser 错误:ParseException:在第 1 行第 0 列:格式不正确(无效令牌)
【发布时间】:2013-09-05 22:19:18
【问题描述】:

我在尝试解析一些 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() 方法之后。

我尝试过使用 Url 而不是 InputStream,结果相同。

编辑

如果我去应用程序管理并擦除应用程序缓存,那么它可以正常工作,这是第一次。它如何影响解析??

【问题讨论】:

    标签: android xml saxparser saxparseexception parseexception


    【解决方案1】:

    知道了!

    问题是RSS有问题!

    不是每个浏览器都会显示它(当他们用颜色格式化时,它们会消除问题),但源代码的开头如下:

    <?xml version=\"1.0\" encoding=\"UTF-8\"?>
          <rss version=\"2.0\">
              <channel>
                   <title>Top Canciones</title>
                   <link>m.ideasmusik.com/rss/?ct=mx&</link> ...
    

    问题是 XML 不能有 & 符号而不被转义。

    文档中的所有其他符号都被转义了,但我认为他们错过了那个符号,因为它位于链接标签中,而不是主要内容。

    SAX 解析器在第一次运行时不知何故忽略了这一点..

    我所做的(在 RSS 已修复的情况下)是获取字符串响应并在解析 XML 之前手动删除该 &。我知道这是一个糟糕的解决方案,但它是目前最快、最简单的解决方案。

    【讨论】:

    • 如果你能分享代码那就太好了..我面临着类似的问题,不知道如何解决它
    • @nathandrake 我现在没有代码,但不是直接流式传输和解析 XML,而是首先将其保存为字符串,替换字符,然后相应地用 SAX 解析.但是,最好的解决方案是要求后端开发人员转义字符,或要求内容管理器删除 &
    【解决方案2】:

    但最奇怪的是我第一次解析响应它 没问题,但是以下所有尝试都给了我解析异常

    我遇到了同样的问题。它发生在某些设备(例如三星 Galaxy S2)上,不仅在 android 2.3 上,而且在以后也发生。例如。在 Galaxy S2 (4.4.2) 上会发生,但在模拟器 (4.4.2) 上不会。问题可能在于缓存请求。在第二个带有 XML 的请求字符串被写入并以错误的字符编码后再次读取。

    我解决了(经过大量工作;))在我的连接上添加简单的 setUseCaches(false) 的问题:

        URLConnection conn = url.openConnection();
        conn.setUseCaches(false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多