1

I would like to display the values of XML "category" tags in a Spinner. I can't get XmlPullParser work, I always get XmlPullParserException. I have this XML parser class:

public class XmlCategoryParser {

private static final String ns = null;

public List<String> 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();
    }
}

// Processing the feed
private List<String> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
    List<String> categories = new ArrayList<String>();

    parser.require(XmlPullParser.START_DOCUMENT, ns, "feed");
    while (parser.next() != XmlPullParser.END_DOCUMENT) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }
        String name = parser.getName();
        // Starts by looking for the category tag
        if (name.equals("category")) {
            categories.add(readCategory(parser));
        } else {
            skip(parser);
        }
    }  
    return categories;
}

// Processes category tags in the feed.
private String readCategory(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, ns, "category");
    String category = readText(parser);
    parser.require(XmlPullParser.END_TAG, ns, "category");
    return category;
}

// Extracts text values of category tags.
private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
    String result = "";
    if (parser.next() == XmlPullParser.TEXT) {
        result = parser.getText();
        parser.nextTag();
    }
    return result;
}

// Skips tags that are not interested.
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;
        }
    }
 }

}

In the MainActivity class, I have:

public void addItemsOnSpinner() {
    XmlCategoryParser categoryParser = new XmlCategoryParser();
    List<String> categories = null;
    InputStream inputStream = null;

    try {
        inputStream = getAssets().open(FILENAME);
        categories = categoryParser.parse(inputStream);
    } catch (FileNotFoundException e) {
        // ...
    } catch (IOException e) {
        // ...
    } catch (XmlPullParserException e) {
        // ...
    }

}

I always get an XmlPullParserException error message and my categories list is empty (returns null). My XML file is in the project's assets folder. Can anyone help?
Thank you in advance!

Blo
  • 11,903
  • 5
  • 45
  • 99

0 Answers0