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

XmlMapper解析XML为LinkedHashMap时如何保留root根节点?

保留XML根节点反序列化为包含根节点的Map

嘿,这个问题我之前也碰到过!默认情况下Jackson的XmlMapper把XML转成Map时,会直接跳过根节点,把子节点直接作为Map的键值对返回。要保留根节点,其实有几种简单的方法:

方法一:先解析为JsonNode再转Map

这种方法不需要自定义类,直接利用Jackson的树形结构处理就能完整保留根节点:

public static void main(String[] args) throws IOException { 
    XmlMapper xmlMapper = new XmlMapper(); 
    // 先读取为JsonNode,此时会完整保留XML的节点层级结构
    JsonNode rootNode = xmlMapper.readTree("<root><a>1</a><b>2</b></root>"); 
    // 再把JsonNode转成LinkedHashMap
    LinkedHashMap<String, Object> result = xmlMapper.convertValue(rootNode, LinkedHashMap.class); 
    System.out.println(result); 
}

执行这段代码后,你就能得到想要的结果:{root={a=1, b=2}}

方法二:自定义包装类(适合有扩展需求的场景)

如果之后需要对根节点下的内容做更明确的类型控制,或者有后续扩展计划,可以自定义一个简单的包装类:

// 自定义包装类对应XML的根节点
static class RootContainer {
    private Map<String, Object> root;

    // 这里的JsonProperty要和XML根节点名称完全一致
    @JsonProperty("root")
    public Map<String, Object> getRoot() {
        return root;
    }

    public void setRoot(Map<String, Object> root) {
        this.root = root;
    }
}

public static void main(String[] args) throws IOException { 
    XmlMapper xmlMapper = new XmlMapper(); 
    RootContainer container = xmlMapper.readValue("<root><a>1</a><b>2</b></root>", RootContainer.class); 
    // 把包装类转成目标格式的Map,或者直接使用container.getRoot()获取内部内容
    LinkedHashMap<String, Object> result = new LinkedHashMap<>();
    result.put("root", container.getRoot());
    System.out.println(result); 
}

这种方法的优势是类型更明确,适合后续需要对节点内容做精细化处理的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:06:55