通八洲科技

Java如何将Map转换为XML字符串

日期:2025-12-31 00:00 / 作者:幻夢星雲
Java中将Map转XML最推荐用Jackson的XmlMapper,需添加jackson-dataformat-xml依赖,通过writer().withRootName()或ObjectNode包装实现;XStream次选,配置简单但默认嵌套结构;禁用手动拼接。

Java中将Map转换为XML字符串,最直接的方式是使用第三方库(如Jackson、XStream或JAXB),因为标准Java API不提供原生的Map→XML转换功能。手动拼接XML字符串容易出错且不支持嵌套、特殊字符转义等问题,不推荐生产环境使用。

使用Jackson的XmlMapper(推荐)

Jackson的xml-databind模块提供了简洁、健壮的Map与XML互转能力,支持嵌套Map、List,自动处理转义和命名空间(可选)。


  com.fasterxml.jackson.dataformat
  jackson-dataformat-xml
  2.15.2

XmlMapper xmlMapper = new XmlMapper();
// 可选:配置避免输出XML声明、缩进等
xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, false);

Map data = new HashMap();
data.put("name", "张三");
data.put("age", 28);
data.put("city", "上海");

String xml = xmlMapper.writeValueAsString(new SimpleModule().addSerializer(Map.class, new MapXmlSerializer()));
// ⚠️注意:Jackson默认不直接支持Map序列化为XML,需包装或使用自定义策略

更实用的做法是将Map包装为一个顶层对象,或使用ObjectNode

ObjectNode root = xmlMapper.createObjectNode();
root.put("name", "张三").put("age", 28).put("city", "上海");
String xml = xmlMapper.writeValueAsString(root);
// 输出示例:
// 张三28上海

若需自定义根节点名(如),可用@JacksonXmlRootElement配合简单POJO,或借助XmlMapper.writer().withRootName("person")

String xml = xmlMapper.writer()
.withRootName("person")
.writeValueAsString(data);

使用XStream(轻量、无需注解)

XStream配置简单,对Map天然友好,适合快速集成。


  com.thoughtworks.xstream
  xstream
  1.4.20
XStream xstream = new XStream(new DomDriver());
xstream.alias("map", HashMap.class); // 可选:自定义根标签名
xstream.alias("entry", Map.Entry.class);
xstream.addImplicitCollection(HashMap.class, "entry");
// 或更简洁方式(XStream 1.4+ 支持直接序列化Map)
String xml = xstream.toXML(data);
// 输出类似:
// name张三...

如需扁平结构(键直接作标签名),可配合XStreamWrapper或预处理Map为NamedObject形式,但通常建议接受其默认嵌套格式或改用Jackson。

注意事项与避坑点

不推荐:手动拼接XML

仅适用于极简场景(如固定结构、无用户输入):

StringBuilder sb = new StringBuilder("");
for (Map.Entry e : map.entrySet()) {
String key = escapeXml(e.getKey());
String val = escapeXml(String.valueOf(e.getValue()));
sb.append("").append(val).append("").append(key).append(">");
}
sb.append("
");

其中escapeXml()需自行实现(替换>&等),无法处理CDATA、属性、命名空间,维护成本高,易引入漏洞。