2010-05-11 11 views
4

J'ai un code java pour lire les nœuds XML, je veux ajouter dans l'addition et je veux aussi lire la valeur du nœud parent.Comment lire la valeur de balise nœud parent XML dans android

mon exemple de fichier XML est ci-dessous:

<breakfast_menu><food id=1><name> Belgian Waffles </name><price> $5.95 </price><description> two of our famous Belgian Waffles with plenty of real maple syrup </description><calories> 650 </calories></food><food id=2><name>Strawberry Belgian waffles</name><price>$7.95</price><description>light Belgian waffles covered with strawberries and whipped cream</description><calories>900</calories></food></breakfast_menu> 

et mon code pour parser XML est:

public static String getProductItem(String pid, String item) { 

    try { 
     url = new URL(""); 
     urlConnection = url.openConnection(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 

    } 

    try { 
     dBuilder = dbFactory.newDocumentBuilder(); 
    } catch (ParserConfigurationException e) { 
    } 
    try { 
     doc = dBuilder.parse(urlConnection.getInputStream()); 
    } catch (SAXException e) { 

    } catch (IOException e) { 

    } 

    doc.getDocumentElement().normalize(); 

    NodeList nList = doc.getElementsByTagName("food"); 

    for (int temp = 0; temp < nList.getLength(); temp++) { 

     Node nNode = nList.item(temp); 

     if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element eElement = (Element) nNode; 



       data = getTagValue(item, eElement); 



     } 
    } 

    doc = null; 
    dBuilder = null; 

    return data; 

} 


private static String getTagValue(String sTag, Element eElement) { 
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0) 
    .getChildNodes(); 
    Node nValue = (Node) nlList.item(0); 

    return nValue.getNodeValue(); 
} 

Ce que je veux faire est de lire la valeur "id" de la nourriture, donc si je suis à la recherche d'un aliment, il ne vérifie que les nœuds alimentaires, dont l'identifiant correspond à l'identifiant du nœud alimentaire.

Si je lis par identifiant de balise, il lit toutes les balises et non spécifiquement une balise. Comment l'atteindre?

+0

Note: Je ne sais pas comment utiliser Xpath dans android; alors suggérez quelques autres options pls –

Répondre

4

Peut-être que j'ai manqué quelque chose, est-ce juste String id = eElement.getAttribute("id"); que vous cherchez?

Vous pouvez vouloir utiliser XPath pour extraire votre DOM. getElementsByTagName a une habitude irritante d'ignorer la structure du document. (Vous devez également utiliser un espace de nom et getElementsByTagNameNS :))

+0

Je ne peux pas utiliser Xpath dans Android, je veux coller avec DOM. est-il possible d'obtenir l'attribut dans DOM? – kaibuki

4

Vous pouvez utiliser XPath pour trouver facilement un ensemble de nœuds en fonction de certains critères. Par exemple:

XPath xpath = XPathFactory.newInstance().newXPath(); 
NodeList nl = (NodeList) xpath.evaluate("//food[@id=22]", doc, XPathConstants.NODESET); 

Ce code trouve tous les nœuds alimentaires avec un identifiant donné dans le document. XPath est une langue riche pour ce genre de critères de recherche.

+1

Je ne peux pas utiliser Xpath dans Adnroid, est-il possible de le faire dans le code mentionné ci-dessus. – kaibuki

+0

Désolé, mais pourquoi ne pas l'utiliser? J'ai utilisé XPath avant sur Android sans problèmes. – kaneda

3

XPath est disponible pour une utilisation dans Android depuis le niveau de l'API 8. Si elle est une option pour vous, supposons que votre xml est placé dans votre projet à

/res/raw/food_list.xml

Étant donné que, vous pouvez rechercher tous les éléments en utilisant cette syntaxe XPath:

//food/@id 

L'expression de recherche ci-dessus renvoie une liste de tous id attributs qui se rapportent à <food> éléments où qu'ils soient depuis la racine.

Donc, si ce que vous voulez est d'aller chercher tous ces attributs id, vous pouvez le faire comme suit

InputStream is = getResources().openRawResource(R.raw.food_list); 
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance(); 

try { 
    Document doc = fac.newDocumentBuilder().parse(is); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression expr; 
    try { 
     expr = xpath.compile("//food/@id"); 
     NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
     for (int i = 0; i < nl.getLength(); i++) { 
       Node node = nl.item(i); 
       // Considering the example XML at the end of this loop you will 
       // get the ids printed 
       System.out.println(node.getNodeValue()); 
     } 
    } catch (XPathExpressionException e) { 
     e.printStackTrace(); 
    } 
    is.close(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} catch (SAXException e) { 
    e.printStackTrace(); 
} catch (ParserConfigurationException e) { 
    e.printStackTrace(); 
} 

Une référence rapide sur la syntaxe XPath et un peu d'explication peut être trouvée here.

+0

Très bonne explication; m'a beaucoup aidé :) thanx :) –

+0

Bon à savoir, Manoj Je suis content de pouvoir aider :) – kaneda