Pergunta

Eu tenho um código Java para ler nós XML, quero adicionar a adição e querer ler o valor do nó pai também.

Minha amostra de arquivo XML está abaixo:

 <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>

E meu código para analisar XML é:

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();
}

O que eu quero fazer é ler o valor "ID" da comida; portanto, se estiver procurando um alimento, ele apenas verifica esses nós de comida, cujo ID correspondeu ao ID do nó.

Se eu leio por identificação de tag, ele lê todas as tags não especificamente uma tag. Como alcançá -lo?

Foi útil?

Solução

Talvez eu sentisse falta de algo, é apenas String id = eElement.getAttribute("id"); que você está procurando?

Você pode querer usar o XPath para buscar seu DOM. getElementsByTagName tem um hábito irritante de ignorar a estrutura do documento. (Também deve estar usando um espaço para nome e getsementsbytagnamens :))

Outras dicas

Você pode usar o XPath para encontrar facilmente um conjunto de nós de acordo com alguns critérios. Por exemplo:

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

Este código encontra todos os nós alimentares com um determinado ID no documento. Xpath é uma linguagem rica para esse tipo de critério de pesquisa.

Xpath está disponível para uso no Android, pois o nível da API 8. Se for uma opção para você, suponha que seu XML seja colocado em seu projeto em

/res/raw/food_list.xml

Dado isso, você pode procurar todos os elementos usando esta sintaxe XPath:

//food/@id

A expressão de pesquisa acima retornará uma lista de todos id atributos que pertencem a <food> elementos onde quer que estejam desde a raiz.

Então, se o que você quer é buscar todos aqueles id atributos, você pode fazer isso da seguinte maneira

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();
}

Uma referência rápida na sintaxe XPath e um pouco de explicação podem ser encontrados aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top