You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定XML解析为Java的NodeList并获取Result节点子值

解决XML命名空间下的eCode和eDesc解析问题

我看你现在的核心问题是XML里带了命名空间,但你的XPath没处理这个,导致找不到Result节点,没法获取里面的eCode和eDesc值。我来帮你把解析流程补全并修正:

首先先明确你的XML结构(带命名空间):

<?xml version = "1.0" encoding = "UTF-8"?>
<ns0:GetADSLProfileResponse xmlns:ns0 = "http://">
    <ns0:Result>
        <ns0:eCode>0</ns0:eCode>
        <ns0:eDesc>Success</ns0:eDesc>
    </ns0:Result>
</ns0:GetADSLProfileResponse>

你的Java代码里忽略了XML的命名空间规则,所以解析器根本找不到对应的节点。下面是修正后的完整解析代码:

CustomerProfileResult pojo = new CustomerProfileResult();
String body = readfile();
System.out.println(body);

try {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    // 开启命名空间支持,这一步是核心!
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse(new InputSource(new StringReader(body)));
    
    XPath xpath = XPathFactory.newInstance().newXPath();
    // 绑定XML里的命名空间前缀与URI,保证XPath能识别带前缀的节点
    xpath.setNamespaceContext(new NamespaceContext() {
        @Override
        public String getNamespaceURI(String prefix) {
            if ("ns0".equals(prefix)) {
                return "http://"; // 必须和XML里的xmlns:ns0值完全一致
            }
            return XMLConstants.NULL_NS_URI;
        }

        @Override
        public String getPrefix(String namespaceURI) {
            return null;
        }

        @Override
        public Iterator<String> getPrefixes(String namespaceURI) {
            return null;
        }
    });
    
    // 修正XPath表达式,带上命名空间前缀
    XPathExpression resultExpr = xpath.compile("/ns0:GetADSLProfileResponse/ns0:Result");
    Node resultNode = (Node) resultExpr.evaluate(dom, XPathConstants.NODE);
    
    if (resultNode != null) {
        // 方式1:用XPath直接定位子节点获取值
        String eCode = xpath.evaluate("ns0:eCode", resultNode);
        String eDesc = xpath.evaluate("ns0:eDesc", resultNode);
        
        // 把值存入你的POJO
        pojo.seteCode(eCode);
        pojo.seteDesc(eDesc);
        
        // 方式2:遍历Result节点的子节点,适合节点数量多的场景
        NodeList childNodes = resultNode.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node node = childNodes.item(i);
            // 只处理元素节点,跳过文本/注释等节点
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                String nodeName = node.getLocalName(); // 获取不带前缀的节点名
                if ("eCode".equals(nodeName)) {
                    System.out.println("eCode值:" + node.getTextContent());
                } else if ("eDesc".equals(nodeName)) {
                    System.out.println("eDesc值:" + node.getTextContent());
                }
            }
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

关键注意点:

  • 必须开启dbf.setNamespaceAware(true),否则解析器会直接忽略XML里的命名空间,导致XPath匹配失败
  • 命名空间的URI必须和XML里的xmlns:ns0值完全一致,前缀可以自定义,但要和XPath里的前缀对应
  • 两种获取子节点值的方式可以二选一,按需使用即可

内容的提问来源于stack exchange,提问作者Bav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:40:07