2014-03-25 1 views
0

Я пытаюсь извлечь информацию из XML-файла, и это код, который я сейчас разрабатываю, чтобы заставить его работать.Цитирование анализатора xml до тех пор, пока не будет выполнен тег

private void parseXML(XmlPullParser parser) 
     throws XmlPullParserException, IOException { 
    int eventType = parser.getEventType(); 

    Map<String, Map<String, Double>> sports = new HashMap<String, Map<String, Double>>(); 

    while (eventType != XmlPullParser.END_DOCUMENT) { 
     String name = null; 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      String sportName = null; 
      boolean paid = false; 
      Map<String, Double> preset = null; 

      switch (eventType) { 
       case XmlPullParser.START_DOCUMENT: 
        preset = new HashMap<String, Double>(); 
        break; 
       case XmlPullParser.START_TAG: 
        name = parser.getName(); 
        if (name.equals("sport")) { 
         sportName = parser.getAttributeValue(0); 
         paid = Boolean.parseBoolean(parser 
           .getAttributeValue(1)); 
        } else if (name.equals("preset")) { 
         // TODO figure out how to loop this so it finished up the sport and then moves on to the next one 
         String presetName = parser 
           .getAttributeValue(0); 
         double value = Double.parseDouble(parser 
           .nextText()); 
         preset.put(presetName, value); 
         parser.next(); 
        } 
        break; 
       case XmlPullParser.END_TAG: 
        name = parser.getName(); 
      } 
      sports.put(sportName, preset); 
      eventType = parser.next(); 
     } 
    } 
} 

И это XML ее вытягивать информацию из

<?xml version="1.0" encoding="utf-8"?> 
<sports> 
    <sport name="Baseball" paid="false"> 
     <preset name="Pitching Mound">726.0</preset> 
     <preset name="Base Distance">1080.0</preset> 
    </sport> 
    <sport name="Basketball" paid="false"> 
     <preset name="NBA Free Throw Line">181.08</preset> 
     <preset name="NBA 3pt Line">265.8</preset> 
    </sport> 
    <sport name="Cricket" paid="true"> 
     <preset name="Cricket Pitch">2012.0</preset> 
    </sport> 
</sports> 

Что код по существу это получает имя спорта, будь то платная функция или нет, и пресетов я определил для этого. То, что я пытаюсь сделать, это сделать часть, где она добавляет пресет к предварительно установленной карте, цикл до конца спортивных пресетов. Я не на 100% удобен в использовании XML-анализов, потому что меня путают с его использованием. Я попытался получить счет атрибута, когда код получил название спорта, а затем зациклил его, но он не работал.

ответ

2

В то время как android docs говорит, что рекомендуется использовать XmlPullParser, вы можете использовать синтаксический анализатор по вашему выбору.

Для получения атрибута вы можете использовать parser.getAttributeValue(null, "name") coz у вас есть <preset name="Pitching Mound">. Имя - это атрибут.

Чтобы использовать текст, используйте text.

В документах есть пример. Он имеет отдельные методы для каждого тега, в то время как метод тот же.

http://developer.android.com/training/basics/network-ops/xml.html

Вы можете использовать ниже для справки.

public class XMLPullParserHandler { 

    private String text; 

    public XMLPullParserHandler() { 

    } 



    public Void parse(InputStream is) { 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 

      parser.setInput(is, null); 

      int eventType = parser.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        if (tagname.equalsIgnoreCase("sports")) { 

        } 
        if (tagname.equalsIgnoreCase("preset")) { 
         Log.i(".......","Attribute value is"+parser.getAttributeValue(null, "name")); 
        } 


        break; 

       case XmlPullParser.TEXT: 
        text = parser.getText(); 
        break; 

       case XmlPullParser.END_TAG: 
        if (tagname.equalsIgnoreCase("sports")) { 
         // add employee object to list 

        } else if (tagname.equalsIgnoreCase("sport")) { 
         // no value 

        } 
        else if (tagname.equalsIgnoreCase("preset")) { 
         Log.i("Preset is",text); 

        } 
        break; 

       default: 
        break; 
       } 
       eventType = parser.next(); 
      } 

     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

Вход Выход

03-25 02:03:00.412: I/Attribute value is(1119): Pitching Mound 
03-25 02:03:00.412: I/Preset is(1119): 726.0 
03-25 02:03:00.412: I/Attribute value is(1119): Base Distance 
03-25 02:03:00.422: I/Preset is(1119): 1080.0 
03-25 02:03:00.422: I/Attribute value is(1119): NBA Free Throw Line 
03-25 02:03:00.422: I/Preset is(1119): 181.08 
03-25 02:03:00.422: I/Attribute value is(1119): NBA 3pt Line 
03-25 02:03:00.422: I/Preset is(1119): 265.8 
03-25 02:03:00.422: I/Attribute value is(1119): Cricket Pitch 
03-25 02:03:00.422: I/Preset is(1119): 2012.0 

Edit:

Чтобы получить атрибут оплачиваемую просто добавьте ниже case XmlPullParser.START_TAG:

else if (tagname.equalsIgnoreCase("sport")) { 
      Log.i("Attribute value is"," "+parser.getAttributeValue(null, "paid")); 
} 
Смежные вопросы