解析从Android上的res文件的XML文件
问题描述:
我想解析一个XML文件,我已经定义了一个名为raw的文件夹,它本身包含在我的android应用程序的res文件夹中。我基本上使用Android开发者指南中关于如何处理XML文件的版本。解析从Android上的res文件的XML文件
http://developer.android.com/training/basics/network-ops/xml.html
目前该应用程序将运行并找到该文件,然后运行解析方法,但都应该找到你想从数据中提取标签的方法似乎跳过,结果我在这种情况下,Unit类型的数组列表中有一个没有名字的Unit。
下面是解析XML文件的类的一个副本,后面跟着我用来测试的XML文件。
public class UnitTableXMLParser extends AsyncTask<InputStream, Void, Void> {
private final String ns = null;
public ArrayList<Unit> parse(InputStream in) throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);
parser.nextTag();
return readFeed(parser);
} finally {
in.close();
}
}
private ArrayList<Unit> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "resources");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("unit")) {
units.add(readUnit(parser));
} else {
skip(parser);
}
}
return units;
}
private Unit readUnit(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, "unit");
String name = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String parserName = parser.getName();
if (parserName.equals("name")) {
name = readName(parser);
}
}
return new Unit(name);
}
private String readName(XmlPullParser parser) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, ns, "name");
String name = readText(parser);
parser.require(XmlPullParser.END_TAG, ns, "name");
return name;
}
private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
String result = "";
if (parser.next() == XmlPullParser.TEXT) {
result = parser.getText();
parser.nextTag();
}
return result;
}
private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0) {
switch (parser.next()) {
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
@Override
protected Void doInBackground(InputStream... params) {
Log.d(TAG, "UnitTableXMLParser exectued");
try {
parse(params[0]);
} catch (IOException e) {
Log.d("Background Thread IOException", e.getMessage());
} catch (XmlPullParserException e) {
Log.d("Background Thread XmlPullParserException", e.getMessage());
} catch (Exception e) {
Log.d("Exception", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void result) {
xmlParsed = true;
super.onPostExecute(result);
}
}
和XML文件:
和输出:
,我可能会错误任何想法,将不胜感激,我已经试过name.matches并包含字符串匹配,但也没有工作。
干杯,
杰米
答
只需通过nextTag()规范的样子。如果它是START_TAG或END_TAG,则调用next()和返回事件,否则将引发新的XMLPullParserException。如果它符合文本或文档块,它不会如何工作。 很明显是这样。所以,你所有的try块被打破,结果为空。一个可怕的例子和糟糕的文档给了developer.android.com! 而我无法给你工作的答案 - 我是Android新手...