读取 XML 到对象的 Java 示例。 可以通过某些.xml
文件或仅通过字符串表示形式提供 XML。 然后,可以在应用中使用填充的 Java 对象进行进一步处理或工作流。
1)JAXB vs SAX vs DOM
Java 提供了许多读取 XML 文件并使用 XML 内容打印,在应用中使用或在 Java 对象中填充数据以进一步在应用生命周期中使用的方法。 用于此目的的三个主要 API 是 XML 的简单 API(SAX
),文档对象模型(DOM
)和 XML 绑定的 Java 架构(JAXB
)。
SAX
或DOM
解析器使用 JAXP API 来解析 XML 文档。 两者都扫描文档并在逻辑上将其分解为离散的片段(例如,节点,文本和注释等)。SAX
解析器从文档的开头开始,并将文档的每个片段按找到它的顺序传递给应用。 内存中没有保存任何内容,因此无法进行任何内存中的操作。DOM
解析器创建一个对象树,该树表示内存中Document
对象中数据的内容和组织。 然后,应用可以在此处浏览树以访问所需的数据,并在适当时对其进行操作。- 当
JAXB
将文档解组为 Java 内容对象时。 Java 内容对象代表 XML 文档的内容和组织,可直接用于您的程序。
2)将 XML 字符串转换为 Java 对象
要读取 XML,请首先获取JAXBContext
。 它是 JAXB API 的入口点,并提供了解组,组组和验证操作的方法。
现在从JAXBContext
获取Unmarshaller
实例。 unmarshal()
方法从指定的 XML 解组 XML 数据,然后返回结果树。
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'
文件。
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]]
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 文件的内容与第一个示例相同。
<?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>
将我的问题放在评论部分。
学习愉快!