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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:04