2015-03-18 2 views
0

У меня есть этот XML онлайн http://64.182.231.116/~spencerf/test.xmlПолучить текст из XML - Android

И я пытаюсь получить два текстовых значения Assorted Cereal и Yogurt Parfait (2). Вот как я сейчас разбираю его, и я получаю значения, которые я хочу, а также все значения в то время, все числа и т. Д., Но я просто хочу получить имена, и я боюсь, как это сделать, любая помощь или руководство были бы замечательными. Вот мой код:

String currentDay = ""; 
     String currentMeal = ""; 
     String counter = ""; 
     String icon1 = ""; 

     LinkedHashMap<String, List<String>> itemsByCounter = new LinkedHashMap<String , List<String>>(); 
     List<String> items = new ArrayList<String>(); 



     while (eventType != XmlResourceParser.END_DOCUMENT) { 
      String tagName = xmlData.getName(); 

      switch (eventType) { 
       case XmlResourceParser.START_TAG: 
        if (tagName.equalsIgnoreCase("day")) { 
         currentDay = xmlData.getAttributeValue(null, "name"); 
        } 
        if (tagName.equalsIgnoreCase("meal")) { 
         currentMeal = xmlData.getAttributeValue(null, "name"); 
        } 
        if (tagName.equalsIgnoreCase("counter") && currentDay.equalsIgnoreCase(day) && currentMeal.equalsIgnoreCase(meal)) { 
         counter = xmlData.getAttributeValue(null, "name"); 
        } 
        if (tagName.equalsIgnoreCase("name") && counter != null && currentDay.equalsIgnoreCase(day) && currentMeal.equalsIgnoreCase(meal)) { 
         icon1 = xmlData.getAttributeValue(null, "icon1"); 
         Log.i(TAG, "icon1: " + icon1); 
        } 

        break; 
       case XmlResourceParser.TEXT: 
        if (currentDay.equalsIgnoreCase(day) && currentMeal.equalsIgnoreCase(meal) && counter !=(null)) { 
         if (xmlData.getText().trim().length() > 0) { 
          //Here gets everything but I just want 2 names 
          Log.i(TAG, "data: " + xmlData.getText()); 
          items.add(xmlData.getText().trim().replaceAll(" +", " ")); 

         } 

        } 
        break; 

       case XmlPullParser.END_TAG: 
        if (tagName.equalsIgnoreCase("counter")) { 
         if (items.size() > 0) { 
          itemsByCounter.put(counter, items); 
          items = new ArrayList<String>(); 
          recordsFound++; 
         } 
        } 
        break; 
      } 
      eventType = xmlData.next(); 

Так как вы можете видеть в комментариях в моем коде я получаю все под именем тега, назад, но я просто хочу, значение имени, а не все другие вещи.

+0

Включить образец вашего XML в самом вопросе. Тогда это всегда доступно людям, которые смотрят на ваш вопрос. –

ответ

0

Вам нужно будет сохранить имя в своем собственном дочернем элементе (что означает положить конец тега перед пищевыми фактами). Под каждым dish, вы могли бы это:

<name>Assorted Cereal</name> 
<nutrition_facts> ... </nutrition_facts> 
0

Не тестировался, но может это сделать по этим направлениям:

List<Nutrition_Facts> nutrition_facts = new ArrayList<Nutrition_Facts>(); 
XMLDOMParser parser = new XMLDOMParser(); 
AssetManager manager = context.getAssets(); 
InputStream stream; 
try {  
    stream = manager.open("test.xml"); //need full path to your file here - mine is stored in assets folder 
    Document doc = parser.getDocument(stream); 
}catch(IOException ex){ 
    System.out.printf("Error reading map %s\n", ex.getMessage()); 
} 
NodeList nodeList = doc.getElementsByTagName("nutrition_facts"); 
for (int i = 0; i < nodeList.getLength(); i++) { 
    Element e = (Element) nodeList.item(i); 
    String name; 
    if (elementName.equals(e.getAttribute("Assorted Cereal"))){ 
     name = e.getAttribute("name"); 
     //do some stuff 

    } 
} 

//XMLDOMParser Class 
public class XMLDOMParser { 
    //Returns the entire XML document 
    public Document getDocument(InputStream inputStream) { 
     Document document = null; 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     try { 
      DocumentBuilder db = factory.newDocumentBuilder(); 
      InputSource inputSource = new InputSource(inputStream); 
      document = db.parse(inputSource); 
     } catch (ParserConfigurationException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } catch (SAXException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } catch (IOException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } 
     return document; 
    } 

    /* 
    * I take a XML element and the tag name, look for the tag and get 
    * the text content i.e for <employee><name>Kumar</name></employee> 
    * XML snippet if the Element points to employee node and tagName 
    * is name I will return Kumar. Calls the private method 
    * getTextNodeValue(node) which returns the text value, say in our 
    * example Kumar. */ 
    public String getValue(Element item, String name) { 
     NodeList nodes = item.getElementsByTagName(name); 
     return this.getTextNodeValue(nodes.item(0)); 
    } 

    private final String getTextNodeValue(Node node) { 
     Node child; 
     if (node != null) { 
      if (node.hasChildNodes()) { 
       child = node.getFirstChild(); 
       while(child != null) { 
        if (child.getNodeType() == Node.TEXT_NODE) { 
         return child.getNodeValue(); 
        } 
        child = child.getNextSibling(); 
       } 
      } 
     } 
     return ""; 
    } 
} 
Смежные вопросы