XmlPullParser:PI不能以xml开头,而只能在Android 2.3.3上向下开始

时间:2012-11-23 16:00:29

标签: android xml-parsing xmlpullparser

我在Android 3.0+上没有出现任何错误,但仅在Android 2.2,2.3.3上,当我尝试通过XmlPullParser解析一个小型XML文件时,该应用程序出现错误:

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

不知怎的,我认为第二种方法会在弱Android手机上造成额外延迟

修改

我从调试器中提取XML内容并看到第一个像\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的样子(仅限起始字符)。

请指教!!!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在检查xml解析器源之后,似乎问题是由于响应开头的字节顺序标记而发生的,在我的情况下&#39; 77u /&#39; (在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);

作为替代方案,您也可以在第一个&#39;&lt;&#39;

之前进行子串

答案 2 :(得分:0)

遇到同样的问题。

对我来说,我用空格'\n'替换了所有' ',然后就可以了。

PS:

@Ahmad说,以前的空行也可能导致这个问题,最好检查第一个字符'&lt;'一个xml字符串。