在Android上解析来自res的XML文件

时间:2012-09-27 17:27:05

标签: android xml parsing tags

我正在尝试解析我在一个名为raw的文件夹中定义的XML文件,该文件夹本身包含在我的android应用程序的res文件夹中。我基本上使用了Android开发者指南中关于如何处理XML文件的版本。

http://developer.android.com/training/basics/network-ops/xml.html

目前应用程序将运行并将找到该文件,然后运行parse方法,但是应该找到要从中提取数据的标记的方法似乎跳过,因此我的类型为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文件:

XML File

输出: Output

任何我可能会出错的想法都会非常感激,我已经尝试过name.matches并且包含了String匹配但它们也没有用。

干杯,

杰米

1 个答案:

答案 0 :(得分:0)

查看nextTag()规范。它调用next()并返回事件,如果它是START_TAG或END_TAG,否则抛出一个新的XMLPullParserException。如果遇到文本或文档块,它没有平面如何工作。  事实很明显。因此,所有try-block都被破坏,结果为null。多么可怕的例子和糟糕的文档给了developer.android.com!  而且我无法给你工作答案 - 我是Android新手......