XmlPullParser-意外令牌(android)
我正在开发一个应用程序,它将读取我在res/xml/experience.xml中存储的xml,但当我尝试解析它时,它会给我一个xmlPullParserException 这是我真正简单的xml文件:XmlPullParser-意外令牌(android),android,xml,xmlpullparser,Android,Xml,Xmlpullparser,我正在开发一个应用程序,它将读取我在res/xml/experience.xml中存储的xml,但当我尝试解析它时,它会给我一个xmlPullParserException 这是我真正简单的xml文件: <?xml version="1.0" encoding="utf-8"?> <message>Hello</message> 这是它带给我的一个例外: 03-16 15:38:52.759: W/System.err(28087):
<?xml version="1.0" encoding="utf-8"?>
<message>Hello</message>
这是它带给我的一个例外:
03-16 15:38:52.759: W/System.err(28087): org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT ???????????????8??????...@2:112 in java.io.InputStreamReader@42604888)
03-16 15:38:52.759: W/System.err(28087): at org.kxml2.io.KXmlParser.next(KXmlParser.java:426)
03-16 15:38:52.759: W/System.err(28087): at org.kxml2.io.KXmlParser.next(KXmlParser.java:310)
03-16 15:38:52.759: W/System.err(28087): at xmlparsing.Xmlreader.parse(Xmlreader.java:53)
03-16 15:38:52.759: W/System.err(28087): at com.example.androidexperiments.Lifecycle.onCreate(Lifecycle.java:28)
03-16 15:38:52.759: W/System.err(28087): at android.app.Activity.performCreate(Activity.java:5231)
03-16 15:38:52.759: W/System.err(28087): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.access$800(ActivityThread.java:135)
03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
03-16 15:38:52.759: W/System.err(28087): at android.os.Handler.dispatchMessage(Handler.java:102)
03-16 15:38:52.759: W/System.err(28087): at android.os.Looper.loop(Looper.java:136)
03-16 15:38:52.759: W/System.err(28087): at android.app.ActivityThread.main(ActivityThread.java:5017)
03-16 15:38:52.759: W/System.err(28087): at java.lang.reflect.Method.invokeNative(Native Method)
03-16 15:38:52.759: W/System.err(28087): at java.lang.reflect.Method.invoke(Method.java:515)
03-16 15:38:52.759: W/System.err(28087): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-16 15:38:52.759: W/System.err(28087): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-16 15:38:52.759: W/System.err(28087): at dalvik.system.NativeStart.main(Native Method)
我花了几个小时在谷歌上试图解决这个问题,但我仍然不知道,有人能告诉我问题出在哪里吗
谢谢我认为错误可能来自您设置为
XmlPullParser
的编码
此行不正确:xpp.setInput(在“UTF_8”中)代码>。它应该是:xpp.setInput(在“UTF-8”中)代码>。如果没有帮助,您甚至可以尝试通过以下方式更改这两行:
InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
xpp.setInput(in, null);
我不确定你是否还在这上面。我至少也有类似的问题。我不会说我已经找到了解决办法,但我已经找到了一个解决办法,不管怎样,它对我的处境很有帮助。我认为我们有同样问题的原因是因为它在例外中所说的@2:112. 您可能知道,这意味着输入的第2行第112列。考虑到xml输入的简洁性,这显然是荒谬的,因为第二行输入没有接近112列。从我的简单输入中,我在异常中看到了类似的虚假位置
我认为问题可能在于您获取InputStream的方式:
InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
如果您花时间将InputStream中的输入转换为字符串(可以找到相应的代码),您将看到每一行都返回虚假数据;有很多垃圾字符与xml数据字符混合在一起。我不知道为什么。也许更精通Java的人可以回答这个问题。。我怀疑这是因为xml文件是作为原始资源打开的(正如它所说的),需要使用某种编码打开它,比如utf-8来正确地翻译它?无论如何,当我使用.openRawResource(..)
函数时,它似乎在InputStream中包含了大量垃圾数据,这阻塞了XmlPullParser。我的解决方案是将.xml文件从res/xml/
文件夹移动到assets
文件夹。然后,我以这种方式获取InputStream
InputStream in = this.getAssets().open("sample.xml");
当我这样做的时候,我注意到InputStream中没有垃圾字符,XmlPullParser能够毫无例外地解析我的文件
希望对您有所帮助,祝您好运。我也有同样的错误,我刚刚从doInBackground()方法中删除了附加字符串!
它是:
现在:
@Override
protected String doInBackground(String... strings) {
Log.d(TAG, "doInBackground: starts with: " + strings[0]);
String rssFeed = downloadXML(strings[0]);
return rssFeed;
}
在我的例子中,删除xml文件中前导的3个字节(BOM=0xEF BB BF)后,错误消失了。哪个是Xmlreader.java文件的第53行?这一行eventType=xpp.next()代码>这也没用。它仍然让我犯同样的错误,看起来也是我的答案。我自己也遇到了这个问题。谢谢你终于拿到了。
@Override
protected String doInBackground(String... strings) {
Log.d(TAG, "doInBackground: starts with: " + strings[0]);
String rssFeed = downloadXML(strings[0]);
return "test:\n "+rssFeed;
}
@Override
protected String doInBackground(String... strings) {
Log.d(TAG, "doInBackground: starts with: " + strings[0]);
String rssFeed = downloadXML(strings[0]);
return rssFeed;
}