【问题标题】:parsing xml with XmlPullParser使用 XmlPullParser 解析 xml
【发布时间】:2013-11-21 21:25:58
【问题描述】:

我正在尝试解析此 XML,但我只能加载一个条目 (19.12.2011 obed polevka1 Zeleninová 7,00 16,00)。 条目应类似于 [date][meal][type][name][price_student][price_other] 感谢您的想法!

XML 示例:

<?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>

我的解析器是基于developer.andoid 代码

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

【问题讨论】:

    标签: java android xml xml-parsing xmlpullparser


    【解决方案1】:

    在您的 readEntry 函数中,您的 while 循环必须在没有 END_DOCUMENT 时进行迭代。

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

    【讨论】:

    • 非常感谢!它不在 "private Entry readEntry(XmlPullParser parser)" 而是在 "private List readFeed(XmlPullParser parser) " 准确地说
    • 是的!对不起,我在复制粘贴时犯了一个错误;)
    • 我试图改变我的代码,所以它可以每天加载超过 条目,但没有任何成功。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2013-02-10
    • 2016-12-21
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多