【问题标题】:Parsing XML File from res on Android在 Android 上从 res 解析 XML 文件
【发布时间】:2012-09-27 17:27:04
【问题描述】:

我正在尝试解析我在名为 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 文件:

然后输出:

任何我可能出错的想法都将不胜感激,我已经尝试过 name.matches 和 contains 用于字符串匹配,但也没有用。

干杯,

杰米

【问题讨论】:

    标签: android xml parsing tags


    【解决方案1】:

    只需查看 nextTag() 规范。如果它是 START_TAG 或 END_TAG,它调用 next() 并返回事件,否则抛出一个新的 XMLPullParserException。如果它遇到文本或文档块,它是如何工作的。 很明显,情况就是这样。所以,你所有的 try- 块都被破坏了,结果为空。多么糟糕的例子和糟糕的文档给了 developer.android.com! 我无法给你有效的答案——我是 Android 新手...

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2019-01-25
      相关资源
      最近更新 更多