如何将指定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
相关产品推荐
相关产品推荐

