Как читать значение тегового узла XML родительского узла в Android
-
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 и немного объяснения здесь.