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 生成过程 | 代码量较大,复杂度高 |
根据你的需求选择合适的工具。如果需要快速实现,推荐使用 XStream 或 Jackson ;如果需要标准化,可以使用 JAXB ;如果需要完全控制,可以使用 DOM/SAX。