Как читать значение тегового узла XML родительского узла в Android

StackOverflow https://stackoverflow.com/questions/2808793

  •  25-09-2019
  •  | 
  •  

Вопрос

У меня есть код 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();
}

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

/res/raw/food_list.xml.

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

//food/@id

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

Так что если то, что вы хотите, это привлечь всех тех 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 и немного объяснения здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top