我在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的样子(仅限起始字符)。
请指教!!!
答案 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字符串。