如何在android中读取XML父节点标记值

时间:2010-05-11 07:29:33

标签: android android-xml

我有一个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”值,所以如果我正在寻找食物,它只检查那些id与食物节点id匹配的食物节点。

如果我按标签ID读取,它会读取所有标签而不是特定标签。如何实现呢?

3 个答案:

答案 0 :(得分:4)

也许我错过了某些东西,你只是想找String id = eElement.getAttribute("id");吗?

您可能希望使用XPath来提取DOM。 getElementsByTagName有一种忽略文档结构的恼人习惯。 (也应该使用命名空间和getElementsByTagNameNS :))

答案 1 :(得分:4)

您可以使用XPath根据某些条件轻松找到一组节点。 例如:

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

此代码在文档中查找具有给定id的所有食物节点。 XPath是这种搜索条件的丰富语言。

答案 2 :(得分:3)

从API级别8开始,

XPath可在Android中使用。如果它是您的选项,请假设您的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语法的快速参考和一些解释here