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
相关产品推荐
相关产品推荐

