I have a java code to read XML nodes, I want to add in the addition and want to read the parent node value also.
my XML file sample is below:
<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>
and my code for parsing xml is :
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) nlLi开发者_StackOverflow中文版st.item(0);
return nValue.getNodeValue();
}
What I want to do is to read the "id" value of food, so if if I am searching for a food, it only checks those food nodes, whose id matched the food node id.
if I read by tag id, it reads all tags not specifically one tag. How to achieve it?
Maybe I missed somthing, is it just String id = eElement.getAttribute("id");
that you're looking for?
You may want to look into using XPath to fetch out of your DOM. getElementsByTagName has an irritating habit of ignoring the document structure. (Also ought to be using a namespace and getElementsByTagNameNS :) )
You can use XPath to easily find a set of nodes according to some criteria. For example:
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList) xpath.evaluate("//food[@id=22]", doc, XPathConstants.NODESET);
This code finds all food nodes with a given id in the document. XPath is a rich language for this kind of search criteria.
XPath is available for use in Android since API level 8. If it's an option for you, suppose your xml is placed in your project at
/res/raw/food_list.xml
Given that, you may search for all elements using this xpath syntax:
//food/@id
The above search expression will return a list of all id
attributes that pertain to <food>
elements wherever they are since root.
So if what you want is to fetch all those id
attributes, you can do it as follows
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();
}
A quick reference on XPath syntax and a bit of explanation can be found here.
精彩评论