杰瑞科技汇

Java如何将XML转换为对象?

在Java中将XML转换为对象

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

Java如何将XML转换为对象?-图1
(图片来源网络,侵删)

使用JAXB (Java Architecture for XML Binding)

JAXB是Java标准库中用于XML绑定的API,Java 6及以上版本内置。

基本步骤:

  1. 创建Java类:为XML元素创建对应的Java类
  2. 注解类:使用JAXB注解标记类和字段
  3. 执行转换:使用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:功能强大,支持复杂映射,需要额外依赖

根据你的具体需求和项目环境选择最适合的方法。

Java如何将XML转换为对象?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇