我正在开发一个应用程序,它将从我在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 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)
我花了几个小时在谷歌试图解决它,但我仍然不知道,有人能指出我的问题在哪里?
由于
答案 0 :(得分:5)
我认为错误可能来自您已设置为XmlPullParser
的编码。
此行不正确:xpp.setInput(in, "UTF_8");
。它应该是:xpp.setInput(in, "UTF-8");
。如果它没有帮助,您甚至可以尝试通过以下方式更改这两行:
InputStream in = ctx.getResources().openRawResource(R.xml.experiment);
xpp.setInput(in, null);
答案 1 :(得分:3)
不确定你是否仍然坚持这一点。我至少有类似的问题。我不会说我找到了 解决方案,但我发现了一个对我的情况有帮助的解决方法。我认为我们遇到同样问题的原因是因为它在异常中所说的内容。@ 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能够解析我的文件而没有任何例外。
希望有所帮助,祝你好运。
答案 2 :(得分:1)
对于我来说,在我删除了xml文件中的前3个字节(BOM = 0xEF BB BF)后,错误消失了。
答案 3 :(得分:0)
我有同样的错误,我只是从doInBackground()方法中删除了附加的字符串! 是:
@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;
}