首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用XmlPullParser解析xml

用XmlPullParser解析xml
EN

Stack Overflow用户
提问于 2013-11-21 21:25:58
回答 1查看 494关注 0票数 0

我正在尝试解析这个XML,但我只能加载一个条目(19.12.2011 obed polevka1 Zeleninová7,0016,00)。条目应该看起来像datetypeprice_student,谢谢你的想法!

XML示例:

代码语言:javascript
复制
<?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>

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

代码语言:javascript
复制
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;
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-21 23:48:11

readEntry函数中,while循环必须在没有END_DOCUMENT的情况下迭代。

代码语言:javascript
复制
private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
    // ...
    while (parser.next() != XmlPullParser.END_DOCUMENT) {
    // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20132227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档