有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java XML递归解析查找元素

我有一个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) 个答案

  1. # 1 楼答案

        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. # 2 楼答案

    基于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;
    
        }
    
  3. # 3 楼答案

    Xpath应该使用

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