男儿欲遂平生志,五经勤向窗前读。这篇文章主要讲述XmlPullParser - 意外令牌(android)相关的知识,希望能为你提供帮助。
我正在开发一个应用程序,它将从我在res / xml / experiment.xml中存储的xml中读取,但是当我尝试解析它时,它给了我一个xmlPullParserException。
这是我非常简单的xml文件:
<
?xml version="1.0" encoding="utf-8"?>
<
message>
Hello<
/message>
这是我的代码:
public static void parse(Context ctx) throws XmlPullParserException, IOException {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
xpp.setInput(in, "UTF_8");
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = xpp.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
Log.d("debug", "Entering tag: " + tagName);
break;
case XmlPullParser.TEXT:
Log.d("debug", "Text inside: " + xpp.getText());
break;
case XmlPullParser.END_TAG:
Log.d("debug", "Ending tag: " + tagName);
break;
}eventType = xpp.next();
}}
以下是它抛出的异常:
03-16 15:38:52.759: W/System.err(28087): org.xmlpull.v1.XmlPullParserException:Unexpected token (position:TEXT ???????????????8??????...@2:112 injava.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):atorg.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 - 意外令牌(android)】谢谢
答案不确定你是否仍然坚持这一点。我至少有类似的问题。我不会说我已经找到了解决方案,但我找到了一个解决方案,无论如何都有助于我的情况。我认为我们遇到同样问题的原因是因为它在异常中所说的内容。@ 2:112。您可能知道这意味着输入的第2行第112列。考虑到你的xml输入的简洁性,这显然是荒谬的,因为你的第二行输入没有接近112列。从我的简单输入中我看到了一个类似虚假的异常位置。
我认为问题可能是你获取InputStream的方式:
InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
如果您花时间将InputStream中的输入转换为String(可以找到此代码),您将看到每行返回虚假数据; 有很多垃圾字符与xml数据字符混合在一起。我不知道为什么。也许更熟悉Java的人可以回答这个问题。我怀疑是因为xml文件是作为原始资源打开的(就像它说的那样)并且它需要用某种编码打开,比如utf-8要翻译它正确..?无论如何,当我使用
.openRawResource(..)
函数时,它似乎在InputStream中带来了大量的垃圾数据,这会阻塞XmlPullParser。我的解决方案是将.xml文件从res/xml/
文件夹移动到assets
文件夹。然后我以这种方式获得了InputStream。InputStream in = this.getAssets().open("sample.xml");
当我这样做时,我注意到InputStream中没有垃圾字符,并且XmlPullParser能够解析我的文件而没有任何异常。
希望有所帮助,祝你好运。
另一答案我认为错误可能来自您设置为
XmlPullParser
的编码。这行不正确:
xpp.setInput(in, "UTF_8");
。它应该是:xpp.setInput(in, "UTF-8");
。如果它没有帮助,您甚至可以尝试通过以下方式更改这两行:InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
xpp.setInput(in, null);
另一答案我有同样的错误,我只是从我的doInBackground()方法中删除了附加的字符串!它是 :
@Override
protected String doInBackground(String... strings) {
Log.d(TAG, "doInBackground: starts with: " + strings[0]);
String rssFeed = downloadXML(strings[0]);
return "test:
"+rssFeed;
}
现在:
@Override
protected String doInBackground(String... strings) {
Log.d(TAG, "doInBackground: starts with: " + strings[0]);
String rssFeed = downloadXML(strings[0]);
return rssFeed;
}
推荐阅读
- 如何在Android中正确设置谷歌播放登录()
- 以有效的方式管理android片段创建()
- 当我正在尝试为我正在通过Unity开发的游戏构建apk文件时,Android SDK未正确安装错误()
- 如何从Android-x86中的命令行启动GUI
- 访问设备/模拟器文件系统在Android Studio中
- 如何在Android应用程序中添加垂直滚动条( [关闭])
- 在android中是否有任何方法可以获得设备虚拟键盘的高度
- 使用Gitlab CI生成Android构建
- 在android模拟器中禁用menubutton