2013-11-21 34 views
0

我想解析这个XML,但我只能加载一个条目(19.12.2011 obed polevka1Zeleninová7,00 16,00)。 条目应该看起来像[日期] [餐食] [类型] [名称] [price_student] [price_other] 感谢您的想法!用XmlPullParser解析xml

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> 

和我的解析器,WHIS基于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; 
      } 
     } 
    } 
} 

回答

0

在你readEntry功能,while循环必须重复而没有END_DOCUMENT。

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

非常感谢你!这不是在**“私人资金进入readEntry(XmlPullParser解析器)” **,但**“私人列表 readFeed(XmlPullParser解析器)” **是准确 – Ofer

+0

是!对不起,我在复制粘贴时犯了一个错误;) – David

+0

我试图更改我的代码,所以它可以每天加载超过条目,但没有任何成功。有关于此的任何想法? – Ofer