6

我在 Android 3.0+ 上没有错误,但只有在 Android 2.2、2.3.3 上,当我尝试通过 解析一个小的 XML 文件时XmlPullParser,应用程序因错误而中断:

org.xmlpull.v1.XmlPullParserException: PI must not start with xml 
(position:unknown @1:5 in java.io.InputStreamReader@40568770) 

错误中提到的 PI 是什么???

我发现这可能会导致 XML 文件 ( <?xml version="1.0" encoding="utf-8"?>) 的第一行,但我没有找到在较低的 Android 版本上发生这种情况的原因。

如果这是错误的原因(XML 文件的第一行),我该如何解决?

我应该:
a) 要求 Web 服务器的管理员更改 XML?如果是,他应该在 XML 中更改什么?
b) 子字符串InputStream使用BufferedReader

不知何故,我认为第二种方法会在弱安卓手机上造成额外的延迟。

编辑

我从调试器中提取 XML 内容,看到第一个 like 以 结尾\r\n,然后下一个字符开始。这对你有什么影响吗?

这就是 XML 文件的样子。这是一个很小的应用程序崩溃的视觉原因。

<?xml version="1.0" encoding="utf-8"?>
<song>
  <artist>Pink Floyd</artist>
  <title>Shine On You Crazy Diamond</title>
  <picture>http://www.xxyz.com/images/image.jpg</picture>
  <time>Fri, 23 Nov 2012 11:22:31 GMT</time>
</song>

这就是从这个 XML 中获取的 InputStream 的样子(仅起始字符)。

请指教!!!

4

3 回答 3

1

我在应用程序上使用的数据文件遇到了同样的问题。在 android 2.3.* 上有这个异常,问题是 UTF-8 BOM,所以我在 Windows 上找到的更简单的解决方案是使用 Notepad++ 工具,它可以让你将文件编码转换为 UTF-8 而没有 BOM 和而已。

于 2013-11-26T16:30:45.613 回答
1

在检查了 xml 解析器源之后,似乎问题是由于响应开头的字节顺序标记而发生的,在我的例子中是 '77u/'(在 base64 中)。如果您不将流转换为 String 而是直接对其进行解析,则解析器会正确地将其丢弃。

例如,而不是

String xml = new String(xmlData, "UTF-8");
KXmlParser parser = new KXmlParser();
parser.setInput(new StringReader(xml));

利用

KXmlParser parser = new KXmlParser();
parser.setInput(new ByteArrayInputStream(xmlData), null);

作为替代方案,您也可以子字符串直到第一个 '<'

于 2016-03-03T09:37:15.357 回答
0

遇到了同样的问题。

对我来说,我'\n'用空间替换了所有' '内容,然后它就起作用了。

PS:

@Ahmad 说,之前的空行也可能导致此问题,最好检查 xml 字符串的第一个字符 '<'。

于 2013-08-16T06:48:02.680 回答