Java中XML转Object的方法
在Java中,将XML转换为对象(反序列化)有几种常用方法,以下是几种主流的实现方式:

使用JAXB (Java Architecture for XML Binding)
JAXB是Java标准库中用于XML绑定的API,Java 6及以上版本内置。
示例代码:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class XmlToObjectConverter {
public static <T> T convertXmlToObject(String xml, Class<T> clazz) throws Exception {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(xml));
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
String xml = "<person><name>John Doe</name><age>30</age></person>";
try {
Person person = XmlToObjectConverter.convertXmlToObject(xml, Person.class);
System.out.println(person.getName()); // 输出: John Doe
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 对应的POJO类
@XmlRootElement(name = "person")
class Person {
private String name;
private int age;
// getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
使用XStream
XStream是一个流行的第三方库,用于XML和Java对象之间的转换。
示例代码:
import com.thoughtworks.xstream.XStream;
public class XStreamXmlConverter {
public static <T> T convertXmlToObject(String xml, Class<T> clazz) {
XStream xstream = new XStream();
xstream.processAnnotations(clazz); // 处理注解
return (T) xstream.fromXML(xml);
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
String xml = "<person><name>John Doe</name><age>30</age></person>";
try {
Person person = XStreamXmlConverter.convertXmlToObject(xml, Person.class);
System.out.println(person.getName()); // 输出: John Doe
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 对应的POJO类(需要XStream注解)
@XStreamAlias("person")
class Person {
@XStreamAsAttribute
private String name;
private int age;
// getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
使用DOM解析器手动转换
对于更复杂的XML结构,可以使用DOM解析器手动解析:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
public class DomXmlConverter {
public static Person convertXmlToObject(String xml) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element root = document.getDocumentElement();
Person person = new Person();
NodeList nameNodes = root.getElementsByTagName("name");
if (nameNodes.getLength() > 0) {
person.setName(nameNodes.item(0).getTextContent());
}
NodeList ageNodes = root.getElementsByTagName("age");
if (ageNodes.getLength() > 0) {
person.setAge(Integer.parseInt(ageNodes.item(0).getTextContent()));
}
return person;
}
}
使用Jackson XML模块
Jackson库也支持XML处理:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class JacksonXmlConverter {
public static <T> T convertXmlToObject(String xml, Class<T> clazz) throws Exception {
XmlMapper xmlMapper = new XmlMapper();
return xmlMapper.readValue(xml, clazz);
}
}
注意事项
- 性能考虑:对于大型XML文件,DOM解析可能会消耗较多内存,考虑使用SAX或StAX解析器
- 安全性:处理来自不可信源的XML时,要注意XXE攻击风险
- 命名空间:处理带有命名空间的XML时,需要额外配置
- 日期格式:日期字段需要指定正确的格式或使用
@XmlDateFormat注解
方法各有优缺点,选择哪种取决于具体需求、项目环境和XML结构的复杂程度。

