Java XML解析 - 递归查找元素

时间:2018-01-10 14:37:16

标签: java xml recursion

我有一个XML,但我所知道的是我想要找到的值的元素的名称。也就是说,我无法使用XPath轻松检索元素。我必须以递归方式处理我似乎失败的XML。我尝试过的是:

假设具有以下结构的XML:

<Store id="1">
  ...
  <Customer>
    <CustomerId>123</CustomerId>
  </Customer>
</Store>

我想获取CustomerId标记的值。实际上,我不知道我的CustomerId标记在XML中的位置。我尝试了以下递归:

private String parseXmlForCustomerId(Element element) {
    if (element.getNodeName().equals("CustomerId")) {
        return element.getTextContent();
    }
    NodeList children = element.getChildNodes();
    for (int i = 0; i < children.getLength(); i++) {
        Node node = children.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE && parseXmlForCustomerId((Element) node).equals("CustomerId")) {
            return node.getTextContent();
        }
    }
    return "";
}

我做错了什么?

提前致谢!

3 个答案:

答案 0 :(得分:2)

Xpath应该可以使用

XPathExpression expr = xpath.compile("//CustomerId");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

答案 1 :(得分:0)

    if (node.getNodeType() == Node.ELEMENT_NODE
            && parseXmlForCustomerId((Element) node).equals("CustomerId")) {
        return node.getTextContent();
    }

应该是:

    if (node.getNodeType() == Node.ELEMENT_NODE) {
        String found = parseXmlForCustomerId((Element) node);
        if (!found.isEmpty()) {
            return found;
        }
    }

然而,XPath是可能的。

答案 2 :(得分:0)

编写了一个可重用的方法,用于根据nodeTagName从xmlRecords解析TagValue。

public String parseXMLwithNodeTagNames(String xmlRecords, String nodeTagName) {
        String tagValue = "";
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = null;
            String s = new String(xmlRecords.getBytes(), "ISO-8859-1");
            doc = db.parse(new InputSource(new StringReader(s)));
            NodeList nl = doc.getElementsByTagName(nodeTagName);
            if (nl != null) {
                for (int i = 0; i < nl.getLength(); i++) {
                    Node item = nl.item(i);
                    String name = item.getNodeName();
                    tagValue = item.getTextContent();

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return tagValue;

    }