在Java中将XML转换为对象
在Java中,有几种常见的方法可以将XML数据转换为Java对象,以下是几种主流的实现方式:

使用JAXB (Java Architecture for XML Binding)
JAXB是Java标准库中用于XML绑定的API,Java 6及以上版本内置。
基本步骤:
- 创建Java类:为XML元素创建对应的Java类
- 注解类:使用JAXB注解标记类和字段
- 执行转换:使用JAXB的Marshaller/Unmarshaller
示例代码:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
// 定义XML对应的Java类
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
private String name;
private int age;
private String email;
// 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; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
public class XmlToObjectConverter {
public static void main(String[] args) {
String xml = "<person><name>张三</name><age>30</age><email>zhangsan@example.com</email></person>";
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal(new StringReader(xml));
System.out.println("姓名: " + person.getName());
System.out.println("年龄: " + person.getAge());
System.out.println("邮箱: " + person.getEmail());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
使用DOM解析器
DOM解析器将整个XML文档加载到内存中,形成树形结构。
示例代码:
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 DomXmlToObject {
public static void main(String[] args) {
String xml = "<person><name>李四</name><age>25</age><email>lisi@example.com</email></person>";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element root = document.getDocumentElement();
NodeList nodeList = root.getChildNodes();
Person person = new Person();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
switch (element.getTagName()) {
case "name":
person.setName(element.getTextContent());
break;
case "age":
person.setAge(Integer.parseInt(element.getTextContent()));
break;
case "email":
person.setEmail(element.getTextContent());
break;
}
}
}
System.out.println("姓名: " + person.getName());
System.out.println("年龄: " + person.getAge());
System.out.println("邮箱: " + person.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX解析器
SAX解析器是事件驱动的,逐行读取XML文档,适合处理大文件。
示例代码:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.StringReader;
public class SaxXmlToObject {
public static void main(String[] args) {
String xml = "<person><name>王五</name><age>28</age><email>wangwu@example.com</email></person>";
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
Person person = new Person();
PersonHandler handler = new PersonHandler(person);
saxParser.parse(new InputSource(new StringReader(xml)), handler);
System.out.println("姓名: " + person.getName());
System.out.println("年龄: " + person.getAge());
System.out.println("邮箱: " + person.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class PersonHandler extends DefaultHandler {
private Person person;
private String currentElement;
public PersonHandler(Person person) {
this.person = person;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) {
currentElement = qName;
}
@Override
public void characters(char[] ch, int start, int length) {
String value = new String(ch, start, length).trim();
if (!value.isEmpty()) {
switch (currentElement) {
case "name":
person.setName(value);
break;
case "age":
person.setAge(Integer.parseInt(value));
break;
case "email":
person.setEmail(value);
break;
}
}
}
}
使用第三方库
使用Jackson XML
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.StringReader;
public class JacksonXmlToObject {
public static void main(String[] args) {
String xml = "<person><name>赵六</name><age>35</age><email>zhaoliu@example.com</email></person>";
try {
XmlMapper xmlMapper = new XmlMapper();
Person person = xmlMapper.readValue(xml, Person.class);
System.out.println("姓名: " + person.getName());
System.out.println("年龄: " + person.getAge());
System.out.println("邮箱: " + person.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用XStream
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XStreamXmlToObject {
public static void main(String[] args) {
String xml = "<person><name>钱七</name><age>40</age><email>qianqi@example.com</email></person>";
try {
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(Person.class);
Person person = (Person) xstream.fromXML(xml);
System.out.println("姓名: " + person.getName());
System.out.println("年龄: " + person.getAge());
System.out.println("邮箱: " + person.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
选择建议
- JAXB:适合简单的XML到Java对象的映射,Java内置无需额外依赖
- DOM:适合需要随机访问XML文档结构的情况,但内存消耗大
- SAX:适合处理大XML文件,内存效率高但编程复杂
- Jackson XML/XStream:功能强大,支持复杂映射,需要额外依赖
根据你的具体需求和项目环境选择最适合的方法。

