0

私は、Androidアプリケーションのresフォルダー内に含まれているrawという名前のフォルダー内で定義したXMLファイルを解析しようとしています。私は基本的に、XMLファイルの処理方法についてAndroid開発者ガイドのバージョンを使用しました。

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ファイル

そして出力: 出力

私が間違っているかもしれないどんな考えでも大いに感謝されるでしょう、私はname.matchesを試しました、そしてそれは文字列照合のために含まれていますが、それもうまくいきませんでした。

乾杯、

ジェイミー

4

1 に答える 1

0

nextTag() 仕様に目を通してください。next() を呼び出し、START_TAG または END_TAG の場合はイベントを返します。それ以外の場合は、新しい XMLPullParserException をスローします。そして、テキストまたはドキュメントブロックに適合する場合、それがどのように機能するかについての不満はありません. それが事実であることは明らかです。したがって、すべての try- ブロックが壊れており、結果は null です。developer.android.com には、なんとひどい例とひどいドキュメントがありました。そして、私はあなたに実用的な答えを与えることができませんでした-私はAndroidが初めてです...

于 2012-10-03T06:09:30.713 に答える