Java解析XML失败求助:提取SOAP响应中的ResponseCode与Remark
如何从嵌套在CDATA中的SOAP响应XML提取ResponseCode和Remark
你遇到的问题核心在于:目标节点被包裹在CDATA区块里了!外层的DOM解析器会把CDATA内的内容当成纯文本,而不是XML结构的一部分,所以直接调用getElementsByTagName肯定找不到<ResponseCode>和<Remark>。
解决思路是先把CDATA里的XML字符串提取出来,再单独解析这个字符串成新的DOM文档,之后就能正常获取节点内容了。
下面是修改后的完整代码:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; try { builder = factory.newDocumentBuilder(); // 解析外层SOAP响应 Document doc = builder.parse(new InputSource(new StringReader(response))); // 第一步:获取GetIMEIInfoResult节点的文本内容(也就是CDATA里的XML字符串) NodeList resultList = doc.getElementsByTagName("GetIMEIInfoResult"); String cdataXml = resultList.item(0).getTextContent().trim(); // 第二步:把CDATA里的字符串解析成新的XML文档 Document innerDoc = builder.parse(new InputSource(new StringReader(cdataXml))); // 第三步:现在可以正常获取ResponseCode和Remark了 Node responseCodeNode = innerDoc.getElementsByTagName("ResponseCode").item(0); Node remarkNode = innerDoc.getElementsByTagName("Remark").item(0); System.out.println("ResponseCode: " + responseCodeNode.getTextContent()); System.out.println("Remark: " + remarkNode.getTextContent()); } catch (Exception e) { e.printStackTrace(); }
额外提醒两点:
- 记得处理节点可能为
null的情况(比如CDATA内容格式错误时),避免空指针异常。 - 如果后续遇到带命名空间的XML结构,可能需要替换成
getElementsByTagNameNS方法来定位节点,但这个案例里内层XML没有命名空间,直接用getElementsByTagName就可行。
内容的提问来源于stack exchange,提问作者Anuj Sharma
相关产品推荐
相关产品推荐

