4

我有一个读取 XML 节点的 java 代码,我想添加并想读取父节点值。

我的 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 读取,它会读取所有标签而不是一个标签。如何实现?

4

3 回答 3

4

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

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

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

于 2010-05-11T08:13:01.450 回答
4

也许我错过了什么,只是String id = eElement.getAttribute("id");你在寻找吗?

您可能想研究使用 XPath 从 DOM 中获取。getElementsByTagName 有一个忽略文档结构的恼人习惯。(也应该使用命名空间和 getElementsByTagNameNS :))

于 2010-05-11T08:06:30.557 回答
3

XPath自 API 级别 8 起可在 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 语法的快速参考和一些解释。

于 2012-12-05T23:18:04.673 回答