🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# JAXB 读取 XML 到 Java 对象的示例 > 原文: [https://howtodoinjava.com/jaxb/read-xml-to-java-object/](https://howtodoinjava.com/jaxb/read-xml-to-java-object/) **读取 XML 到对象**的 Java 示例。 可以通过某些`.xml`文件或仅通过字符串表示形式提供 XML。 然后,可以在应用中使用填充的 Java 对象进行进一步处理或工作流。 ## 1)JAXB vs SAX vs DOM Java 提供了许多读取 XML 文件并使用 XML 内容打印,在应用中使用或在 Java 对象中填充数据以进一步在应用生命周期中使用的方法。 用于此目的的三个主要 API 是 XML 的简单 API([`SAX`](http://www.saxproject.org/)),文档对象模型([`DOM`](https://www.w3.org/DOM/))和 XML 绑定的 Java 架构([`JAXB`](http://jaxb.java.net/))。 * `SAX`或`DOM`解析器使用 [JAXP](https://jaxp.dev.java.net/) API 来解析 XML 文档。 两者都扫描文档并在逻辑上将其分解为离散的片段(例如,节点,文本和注释等)。 * `SAX`解析器从文档的开头开始,并将文档的每个片段按找到它的顺序传递给应用。 内存中没有保存任何内容,因此无法进行任何内存中的操作。 * `DOM`解析器创建一个对象树,该树表示内存中`Document`对象中数据的内容和组织。 然后,应用可以在此处浏览树以访问所需的数据,并在适当时对其进行操作。 * 当`JAXB`将文档解组为 Java 内容对象时。 Java 内容对象代表 XML 文档的内容和组织,可直接用于您的程序。 > 阅读更多:使用 [SAX 解析器](https://howtodoinjava.com/xml/how-to-parse-an-xml-using-sax-parser-and-defaulthandler/)和 [DOM 解析器](https://howtodoinjava.com/xml/java-xml-dom-parser-example-tutorial/)读取 XML ## 2)将 XML 字符串转换为 Java 对象 要读取 XML,请首先获取[`JAXBContext`](https://docs.oracle.com/javase/10/docs/api/javax/xml/bind/JAXBContext.html)。 它是 JAXB API 的入口点,并提供了解组,组组和验证操作的方法。 现在从`JAXBContext`获取[`Unmarshaller`](https://docs.oracle.com/javase/10/docs/api/javax/xml/bind/Unmarshaller.html)实例。 `unmarshal()`方法从指定的 XML 解组 XML 数据,然后返回结果树。 ```java String xmlString = "<employee>" + " <department>" + " <id>101</id>" + " <name>IT</name>" + " </department>" + " <firstName>Lokesh</firstName>" + " <id>1</id>" + " <lastName>Gupta</lastName>" + "</employee>"; JAXBContext jaxbContext; try { jaxbContext = JAXBContext.newInstance(Employee.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Employee employee = (Employee) jaxbUnmarshaller.unmarshal(new StringReader(xmlString)); System.out.println(employee); } catch (JAXBException e) { e.printStackTrace(); } Output: Employee [id=1, firstName=Lokesh, lastName=Gupta, department=Department [id=101, name=IT]] ``` ## 3)将 XML 文件转换为 Java 对象 从文件读取 XML 与上面的示例非常相似。 您只需要传递`File`对象代替`StringReader`对象。 `File`将参考要在文件系统中读取的`'.xml'`文件。 ```java File xmlFile = new File("employee.xml"); JAXBContext jaxbContext; try { jaxbContext = JAXBContext.newInstance(Employee.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Employee employee = (Employee) jaxbUnmarshaller.unmarshal(xmlFile); System.out.println(employee); } catch (JAXBException e) { e.printStackTrace(); } Output: Employee [id=1, firstName=Lokesh, lastName=Gupta, department=Department [id=101, name=IT]] ``` ```java import java.io.Serializable; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "employee") @XmlAccessorType(XmlAccessType.PROPERTY) public class Employee implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String firstName; private String lastName; private Department department; public Employee() { super(); } public Employee(int id, String fName, String lName, Department department) { super(); this.id = id; this.firstName = fName; this.lastName = lName; this.department = department; } //Setters and Getters @Override public String toString() { return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", department="+ department + "]"; } } @XmlRootElement(name = "department") @XmlAccessorType(XmlAccessType.PROPERTY) public class Department implements Serializable { private static final long serialVersionUID = 1L; Integer id; String name; public Department() { super(); } public Department(Integer id, String name) { super(); this.id = id; this.name = name; } //Setters and Getters @Override public String toString() { return "Department [id=" + id + ", name=" + name + "]"; } } ``` xml 文件的内容与第一个示例相同。 ```java <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <employee> <department> <id>101</id> <name>IT</name> </department> <firstName>Lokesh</firstName> <id>1</id> <lastName>Gupta</lastName> </employee> ``` 将我的问题放在评论部分。 学习愉快!