Java中将Map转XML最推荐用Jackson的XmlMapper,需添加jackson-dataformat-xml依赖,通过writer().withRootName()或ObjectNode包装实现;XStream次选,配置简单但默认嵌套结构;禁用手动拼接。
Java中将Map转换为XML字符串,最直接的方式是使用第三方库(如Jackson、XStream或JAXB),因为标准Java API不提供原生的Map→XML转换功能。手动拼接XML字符串容易出错且不支持嵌套、特殊字符转义等问题,不推荐生产环境使用。
Jackson的xml-databind模块提供了简洁、健壮的Map与XML互转能力,支持嵌套Map、List,自动处理转义和命名空间(可选)。
XmlMapper xmlMapper = new XmlMapper();
// 可选:配置避免输出XML声明、缩进等
xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, false);
Map
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:
若需自定义根节点名(如),可用@JacksonXmlRootElement配合简单POJO,或借助XmlMapper.writer().withRootName("person"):
.writeValueAsString(data);
XStream配置简单,对Map天然友好,适合快速集成。
如需扁平结构(键直接作标签名),可配合XStreamWrapper或预处理Map为NamedObject形式,但通常建议接受其默认嵌套格式或改用Jackson。
.、-)、数字开头。Map键若不合规,需预处理(如替换为下划线、加前缀)或抛出异常。SimpleModule)。encoding="UTF-8"(Jackson默认开启,XStream需调用setMode(XStream.NO_REFERENCES)并确认输出流编码)。SecurityFramework默认配置(防止XXE),Jackson默认较安全,但仍建议关闭XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES。仅适用于极简场景(如固定结构、无用户输入):
StringBuilder sb = new StringBuilder("其中escapeXml()需自行实现(替换、>、&等),无法处理CDATA、属性、命名空间,维护成本高,易引入漏洞。