Как прочитать значение тега родительского узла XML в Android - PullRequest
4 голосов
/ 11 мая 2010

У меня есть Java-код для чтения узлов XML, я хочу добавить это дополнение и хочу также прочитать значение родительского узла.

Пример моего файла XML ниже:

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

и мой код для разбора 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();
}

То, что я хочу сделать, это прочитать значение «id» пищи, поэтому, если я ищу еду, он проверяет только те узлы пищи, чей идентификатор соответствует идентификатору узла пищи.

если я читаю по идентификатору тега, он читает все теги, а не только один тег. Как этого добиться?

Ответы [ 3 ]

4 голосов
/ 11 мая 2010

Вы можете использовать XPath, чтобы легко находить набор узлов в соответствии с некоторыми критериями. Например:

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

Этот код находит все узлы питания с данным идентификатором в документе. XPath является богатым языком для такого рода критериев поиска.

4 голосов
/ 11 мая 2010

Может быть, я что-то пропустил, это просто String id = eElement.getAttribute("id");, что вы ищете?

Возможно, вы захотите использовать XPath для извлечения из вашей DOM. getElementsByTagName имеет раздражающую привычку игнорировать структуру документа. (Также следует использовать пространство имен и getElementsByTagNameNS :))

3 голосов
/ 06 декабря 2012

XPath доступен для использования в Android начиная с уровня API 8. Если это вариант для вас, предположим, что ваш XML помещен в ваш проект на

/ Рез / сырье / food_list.xml

Учитывая это, вы можете искать все элементы, используя этот синтаксис xpath:

//food/@id

Вышеупомянутое поисковое выражение вернет список всех атрибутов id, которые относятся к <food> элементам, где бы они ни находились начиная с root.

Итак, если вы хотите получить все эти атрибуты id, вы можете сделать это следующим образом

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

Краткое руководство по синтаксису XPath и немного пояснений можно найти здесь .

...