Java解析SOAP接口HttpResponse,将Results节点转为ArrayList<Map<String,String>>
实现方案
直接用JDK内置的XML解析工具即可完成需求,不需要额外引入第三方依赖,如果你项目中已经集成Jsoup也可以用更简洁的API实现。
JDK内置DOM解析实现(无额外依赖)
核心逻辑
- 从Unirest响应中拿到XML字符串
- 构造XML解析对象,忽略SOAP命名空间减少适配成本
- 遍历所有
Results节点,逐个提取子节点的标签和文本内容存入Map - 汇总所有Map得到最终的List集合
代码示例
import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import kong.unirest.HttpResponse; public List<Map<String, String>> parseSfmcBuResponse(HttpResponse<String> response) throws Exception { List<Map<String, String>> buList = new ArrayList<>(); String xmlContent = response.getBody(); // 初始化XML解析工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 忽略命名空间,适配SOAP前缀场景,需要保留命名空间可设为true factory.setNamespaceAware(false); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(xmlContent.getBytes("UTF-8"))); // 获取所有Results节点 NodeList resultsNodes = doc.getElementsByTagName("Results"); for (int i = 0; i < resultsNodes.getLength(); i++) { Node resultNode = resultsNodes.item(i); Map<String, String> buMap = new HashMap<>(); NodeList childNodes = resultNode.getChildNodes(); for (int j = 0; j < childNodes.getLength(); j++) { Node childNode = childNodes.item(j); // 只处理元素节点,跳过空白文本、注释等无效节点 if (childNode.getNodeType() == Node.ELEMENT_NODE) { String nodeName = childNode.getNodeName(); // 如需去掉节点名的命名空间前缀,打开下方注释 // nodeName = nodeName.contains(":") ? nodeName.split(":")[1] : nodeName; String nodeValue = childNode.getTextContent().trim(); buMap.put(nodeName, nodeValue); } } buList.add(buMap); } return buList; }
Jsoup实现(代码更简洁)
如果项目已经引入Jsoup依赖,用XML解析模式实现的代码更易维护:
依赖引入(未集成的话先加)
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.15.3</version> </dependency>
代码示例
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import kong.unirest.HttpResponse; public List<Map<String, String>> parseSfmcBuResponseWithJsoup(HttpResponse<String> response) { List<Map<String, String>> buList = new ArrayList<>(); Document doc = Jsoup.parse(response.getBody(), "", org.jsoup.parser.Parser.xmlParser()); for (Element resultEl : doc.select("Results")) { Map<String, String> buMap = new HashMap<>(); for (Element childEl : resultEl.children()) { String nodeName = childEl.tagName(); // 去掉命名空间前缀逻辑 // nodeName = nodeName.contains(":") ? nodeName.split(":")[1] : nodeName; buMap.put(nodeName, childEl.text().trim()); } buList.add(buMap); } return buList; }
注意事项
- 两种实现都默认兼容SFMC标准的SOAP返回结构,平级字段的BusinessUnit对象可以直接解析
- 异常可以根据业务场景自行捕获处理,比如空响应、XML格式错误等
- 如果需要处理嵌套的子节点,可以扩展递归解析逻辑即可
内容的提问来源于stack exchange,提问作者Chandrashekhar Dautpure
相关产品推荐
相关产品推荐

