简体   繁体   中英

parsing xml with XmlPullParser

I'm trying to parse this XML, but I can only load one entry (19.12.2011 obed polevka1 Zeleninová 7,00 16,00). Entry should look like [date][meal][type][name][price_student][price_other] Thanks for ideas!

XML example:

<?xml version="1.0" encoding="utf-8"?>
<jidelnicek>
  <den>
    <datum>19.12.2011</datum>
    <obed>
      <polevka1>
        <nazev>Zeleninová</nazev>
        <cena_student>7,00</cena_student>
        <cena_ostatni>16,00</cena_ostatni>
      </polevka1>
      <polevka2>
        <nazev>Krupicová</nazev>
        <cena_student>5,00</cena_student>
        <cena_ostatni>11,00</cena_ostatni>
      </polevka2>
      <stdjidlo1>
        <nazev>Uzená krkovička, dušený špenát, bramborový knedlík</nazev>
        <cena_student>37,00</cena_student>
        <cena_ostatni>77,00</cena_ostatni>
      </stdjidlo1>
      <stdjidlo2>
        <nazev>Ďábelský guláš, houskový knedlík</nazev>
        <cena_student>36,00</cena_student>
        <cena_ostatni>76,00</cena_ostatni>
      </stdjidlo2>
      <stdjidlo3>
        <nazev>Vepřová kýta na slanině, dušená rýže</nazev>
        <cena_student>30,00</cena_student>
        <cena_ostatni>70,00</cena_ostatni>
      </stdjidlo3>
      <bezmjidlo>
        <nazev>Gratinované těstoviny s kuřecím masem a houbovou omáčkou</nazev>
        <cena_student>30,00</cena_student>
        <cena_ostatni>70,00</cena_ostatni>
      </bezmjidlo>
      <sladkejidlo>
        <nazev>Palačinky s džemem, jahodami a šlehačkou</nazev>
        <cena_student>29,00</cena_student>
        <cena_ostatni>59,00</cena_ostatni>
      </sladkejidlo>
      <specialita1>
        <nazev>Kuřecí paličky po Mexicku, jasmínová rýže</nazev>
        <cena_student>44,00</cena_student>
        <cena_ostatni>84,00</cena_ostatni>
      </specialita1>
      <specialita2>
        <nazev>Vepřová kýta se švestkovou  omáčkou, houskový knedlík</nazev>
        <cena_student>31,00</cena_student>
        <cena_ostatni>71,00</cena_ostatni>
      </specialita2>
      <salat>
        <nazev>Cesar salát s kousky mozzarelly</nazev>
        <cena_student>36,00</cena_student>
        <cena_ostatni>76,00</cena_ostatni>
      </salat>
    </obed>
    <vecere>
      <polevka1>
        <nazev>Houbová hnědá</nazev>
        <cena_student>7,00</cena_student>
        <cena_ostatni>14,00</cena_ostatni>
      </polevka1>
      <polevka2>
        <nazev>Česnečka s bramborem</nazev>
        <cena_student>5,00</cena_student>
        <cena_ostatni>11,00</cena_ostatni>
      </polevka2>
      <stdjidlo1>
        <nazev>Srbský vepřový plátek, houskový knedlík</nazev>
        <cena_student>31,00</cena_student>
        <cena_ostatni>71,00</cena_ostatni>
      </stdjidlo1>
      <stdjidlo2>
        <nazev>Kuřecí perkelt dušená rýže</nazev>
        <cena_student>31,00</cena_student>
        <cena_ostatni>71,00</cena_ostatni>
      </stdjidlo2>
      <stdjidlo3>
        <nazev>Těstoviny s rajskou omáčkou a sýrem</nazev>
        <cena_student>22,00</cena_student>
        <cena_ostatni>62,00</cena_ostatni>
      </stdjidlo3>
      <bezmjidlo>
        <nazev>Variace listových salátů s kuřecími nugetkami</nazev>
        <cena_student>30,00</cena_student>
        <cena_ostatni>70,00</cena_ostatni>
      </bezmjidlo>
    </vecere>
  </den>
</jidelnicek>

and my parser, whis is based on developer.andoid code

package com.example.android.networkusage;

import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class StackOverflowXmlParser {
    private static final String ns = null;

    public List<Entry> 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 List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
        List<Entry> entries = new ArrayList<Entry>();

        parser.require(XmlPullParser.START_TAG, ns, "jidelnicek");
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();

            if (name.equals("den")) {
                entries.add(readEntry(parser));
            } else {
                skip(parser);
            }
        }
        return entries;
    }

    public static class Entry {
        public final String date;
        public final String meal;
        public final String type;
        public final String name;
        public final String price_student;
        public final String price_other;

        private Entry(String date, String meal, String type, String name, String price_student, String price_other) {
            this.date = date;
            this.meal = meal;
            this.type = type;
            this.name = name;
            this.price_student = price_student;
            this.price_other = price_other;

        }
    }

    private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
        parser.require(XmlPullParser.START_TAG, ns, "den");
        String date = null;
        String meal = null;
        String type = null;
        String name = null;
        String price_student = null;
        String price_other = null;
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String sname = parser.getName();
            if (sname.equals("datum")) {
                date = readDate(parser);


                }  else if ((sname.equals("obed"))||(sname.equals("vecere"))) {

                meal = sname;

            }  else if ((sname.equals("polevka1"))||(sname.equals("polevka2"))
                    ||(sname.equals("stdjidlo1"))||(sname.equals("stdjidlo2"))||(sname.equals("stdjidlo3"))
                    ||(sname.equals("bezmjidlo"))
                    ||(sname.equals("sladkejidlo"))
                    ||(sname.equals("specialita1"))
                    ||(sname.equals("specialita2"))
                    ||(sname.equals("salat"))
                    ) {
                type = sname;
            } else if (sname.equals("nazev")) {
                name = readName(parser);
            } else if (sname.equals("cena_student")) {
                price_student = readPrice_student(parser);
            } else if (sname.equals("cena_ostatni")) {
                price_other = readPrice_other(parser);
            }
else {
                skip(parser);
            }
        }
        return new Entry(date, meal, type, name, price_student, price_other);
    }

    private String readDate(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "datum");
        String title = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "datum");
        return title;
    }

    private String readName(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "nazev");
        String title = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "nazev");
        return title;
    }

    private String readPrice_student(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "cena_student");
        String title = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "cena_student");
        return title;
    }

    private String readPrice_other(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "cena_ostatni");
        String title = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "cena_ostatni");
        return title;
    }

    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;
            }
        }
    }
}

In your readEntry function, your while loop must iterate while no END_DOCUMENT.

private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    // ...
    while (parser.next() != XmlPullParser.END_DOCUMENT) {
    // ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM