Map<String,Object>转换为XML报文的方法

1. 使用 JAXB (Java Architecture for XML Binding)

JAXB 是 Java 标准库的一部分,支持将 Java 对象与 XML 相互转换。虽然 JAXB 主要用于将 Java 对象转换为 XML,但可以通过一些技巧将 Map<String, Object> 转换为 XML。

示例代码

java 复制代码
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

public class JAXBExample {
    public static void main(String[] args) {
        try {
            // 创建 Map
            Map<String, Object> map = new HashMap<>();
            map.put("name", "John");
            map.put("age", 30);
            map.put("isStudent", false);

            // 将 Map 转换为 XML
            String xml = mapToXml(map);
            System.out.println(xml);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    public static String mapToXml(Map<String, Object> map) throws JAXBException {
        // 创建 JAXBContext
        JAXBContext context = JAXBContext.newInstance(MapWrapper.class);

        // 创建 Marshaller
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        // 将 Map 包装为 MapWrapper
        MapWrapper wrapper = new MapWrapper(map);

        // 将对象转换为 XML
        StringWriter writer = new StringWriter();
        marshaller.marshal(wrapper, writer);
        return writer.toString();
    }

    // 包装类,用于 JAXB 处理 Map
    public static class MapWrapper {
        private Map<String, Object> map;

        public MapWrapper() {
        }

        public MapWrapper(Map<String, Object> map) {
            this.map = map;
        }

        public Map<String, Object> getMap() {
            return map;
        }

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

输出

xml 复制代码
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mapWrapper>
    <map>
        <entry>
            <key>name</key>
            <value>John</value>
        </entry>
        <entry>
            <key>age</key>
            <value>30</value>
        </entry>
        <entry>
            <key>isStudent</key>
            <value>false</value>
        </entry>
    </map>
</mapWrapper>

2. 使用 XStream

XStream 是一个轻量级的库,支持将 Java 对象与 XML 相互转换。它可以直接处理 Map<String, Object>

Maven 依赖

xml 复制代码
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.19</version>
</dependency>

示例代码

java 复制代码
import com.thoughtworks.xstream.XStream;
import java.util.HashMap;
import java.util.Map;

public class XStreamExample {
    public static void main(String[] args) {
        // 创建 Map
        Map<String, Object> map = new HashMap<>();
        map.put("name", "John");
        map.put("age", 30);
        map.put("isStudent", false);

        // 创建 XStream 实例
        XStream xstream = new XStream();

        // 将 Map 转换为 XML
        String xml = xstream.toXML(map);
        System.out.println(xml);
    }
}

输出

xml 复制代码
<map>
    <entry>
        <string>name</string>
        <string>John</string>
    </entry>
    <entry>
        <string>age</string>
        <int>30</int>
    </entry>
    <entry>
        <string>isStudent</string>
        <boolean>false</boolean>
    </entry>
</map>

3. 使用 Jackson XML

Jackson 是一个流行的 JSON 处理库,同时也支持 XML 处理。可以通过 Jackson XML 模块将 Map<String, Object> 转换为 XML。

Maven 依赖

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.13.3</version>
</dependency>

示例代码

java 复制代码
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.util.HashMap;
import java.util.Map;

public class JacksonXmlExample {
    public static void main(String[] args) throws Exception {
        // 创建 Map
        Map<String, Object> map = new HashMap<>();
        map.put("name", "John");
        map.put("age", 30);
        map.put("isStudent", false);

        // 创建 XmlMapper
        XmlMapper xmlMapper = new XmlMapper();

        // 将 Map 转换为 XML
        String xml = xmlMapper.writeValueAsString(map);
        System.out.println(xml);
    }
}

输出

xml 复制代码
<HashMap>
    <name>John</name>
    <age>30</age>
    <isStudent>false</isStudent>
</HashMap>

4. 使用 DOM 或 SAX

如果你需要更底层的控制,可以使用 Java 自带的 DOM 或 SAX API 手动构建 XML。

示例代码(DOM)

java 复制代码
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

public class DomExample {
    public static void main(String[] args) throws Exception {
        // 创建 Map
        Map<String, Object> map = new HashMap<>();
        map.put("name", "John");
        map.put("age", 30);
        map.put("isStudent", false);

        // 将 Map 转换为 XML
        String xml = mapToXml(map);
        System.out.println(xml);
    }

    public static String mapToXml(Map<String, Object> map) throws Exception {
        // 创建 DocumentBuilder
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.newDocument();

        // 创建根元素
        Element root = document.createElement("map");
        document.appendChild(root);

        // 遍历 Map,创建子元素
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            Element element = document.createElement(entry.getKey());
            element.setTextContent(entry.getValue().toString());
            root.appendChild(element);
        }

        // 将 Document 转换为 XML 字符串
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

        DOMSource source = new DOMSource(document);
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);

        transformer.transform(source, result);
        return writer.toString();
    }
}

输出

xml 复制代码
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<map>
    <name>John</name>
    <age>30</age>
    <isStudent>false</isStudent>
</map>

5. 总结

工具 优点 缺点
JAXB Java 标准库,无需额外依赖 需要包装类,对复杂 Map 支持有限
XStream 简单易用,支持复杂对象 需要额外依赖
Jackson 支持 JSON 和 XML,性能好 需要额外依赖
DOM/SAX 完全控制 XML 生成过程 代码量较大,复杂度高

根据你的需求选择合适的工具。如果需要快速实现,推荐使用 XStreamJackson ;如果需要标准化,可以使用 JAXB ;如果需要完全控制,可以使用 DOM/SAX

相关推荐
benbenAItalk5 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl5 小时前
Java学习二 基本语法2, 算术运算符
java·学习
niucloud-admin6 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885726 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户6 小时前
Java锁
java·开发语言
shehuiyuelaiyuehao8 小时前
1计算机是如何工作的
java·计算机网络
yuzhiboyouye8 小时前
那xml对应的sql语法,列举一下
xml·数据库·sql
letisgo58 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周8 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三8449 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker