原文: 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),文档对象模型(DOM)和 XML 绑定的 Java 架构(JAXB)。

  • SAXDOM解析器使用 JAXP API 来解析 XML 文档。 两者都扫描文档并在逻辑上将其分解为离散的片段(例如,节点,文本和注释等)。
  • SAX解析器从文档的开头开始,并将文档的每个片段按找到它的顺序传递给应用。 内存中没有保存任何内容,因此无法进行任何内存中的操作。
  • DOM解析器创建一个对象树,该树表示内存中Document对象中数据的内容和组织。 然后,应用可以在此处浏览树以访问所需的数据,并在适当时对其进行操作。
  • JAXB将文档解组为 Java 内容对象时。 Java 内容对象代表 XML 文档的内容和组织,可直接用于您的程序。

阅读更多:使用 SAX 解析器DOM 解析器读取 XML

2)将 XML 字符串转换为 Java 对象

要读取 XML,请首先获取JAXBContext。 它是 JAXB API 的入口点,并提供了解组,组组和验证操作的方法。

现在从JAXBContext获取Unmarshaller实例。 unmarshal()方法从指定的 XML 解组 XML 数据,然后返回结果树。

  1. String xmlString = "<employee>" +
  2. " <department>" +
  3. " <id>101</id>" +
  4. " <name>IT</name>" +
  5. " </department>" +
  6. " <firstName>Lokesh</firstName>" +
  7. " <id>1</id>" +
  8. " <lastName>Gupta</lastName>" +
  9. "</employee>";
  10. JAXBContext jaxbContext;
  11. try
  12. {
  13. jaxbContext = JAXBContext.newInstance(Employee.class);
  14. Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
  15. Employee employee = (Employee) jaxbUnmarshaller.unmarshal(new StringReader(xmlString));
  16. System.out.println(employee);
  17. }
  18. catch (JAXBException e)
  19. {
  20. e.printStackTrace();
  21. }
  22. Output:
  23. Employee [id=1, firstName=Lokesh, lastName=Gupta, department=Department [id=101, name=IT]]

3)将 XML 文件转换为 Java 对象

从文件读取 XML 与上面的示例非常相似。 您只需要传递File对象代替StringReader对象。 File将参考要在文件系统中读取的'.xml'文件。

  1. File xmlFile = new File("employee.xml");
  2. JAXBContext jaxbContext;
  3. try
  4. {
  5. jaxbContext = JAXBContext.newInstance(Employee.class);
  6. Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
  7. Employee employee = (Employee) jaxbUnmarshaller.unmarshal(xmlFile);
  8. System.out.println(employee);
  9. }
  10. catch (JAXBException e)
  11. {
  12. e.printStackTrace();
  13. }
  14. Output:
  15. Employee [id=1, firstName=Lokesh, lastName=Gupta, department=Department [id=101, name=IT]]
  1. import java.io.Serializable;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlRootElement;
  5. @XmlRootElement(name = "employee")
  6. @XmlAccessorType(XmlAccessType.PROPERTY)
  7. public class Employee implements Serializable {
  8. private static final long serialVersionUID = 1L;
  9. private Integer id;
  10. private String firstName;
  11. private String lastName;
  12. private Department department;
  13. public Employee() {
  14. super();
  15. }
  16. public Employee(int id, String fName, String lName, Department department) {
  17. super();
  18. this.id = id;
  19. this.firstName = fName;
  20. this.lastName = lName;
  21. this.department = department;
  22. }
  23. //Setters and Getters
  24. @Override
  25. public String toString() {
  26. return "Employee [id=" + id + ", firstName=" + firstName + ",
  27. lastName=" + lastName + ", department="+ department + "]";
  28. }
  29. }
  30. @XmlRootElement(name = "department")
  31. @XmlAccessorType(XmlAccessType.PROPERTY)
  32. public class Department implements Serializable {
  33. private static final long serialVersionUID = 1L;
  34. Integer id;
  35. String name;
  36. public Department() {
  37. super();
  38. }
  39. public Department(Integer id, String name) {
  40. super();
  41. this.id = id;
  42. this.name = name;
  43. }
  44. //Setters and Getters
  45. @Override
  46. public String toString() {
  47. return "Department [id=" + id + ", name=" + name + "]";
  48. }
  49. }

xml 文件的内容与第一个示例相同。

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <employee>
  3. <department>
  4. <id>101</id>
  5. <name>IT</name>
  6. </department>
  7. <firstName>Lokesh</firstName>
  8. <id>1</id>
  9. <lastName>Gupta</lastName>
  10. </employee>

将我的问题放在评论部分。

学习愉快!