用于 XML 绑定 (JAXB) 的Java体系结构第一组
XML 绑定的Java体系结构 (JAXB) 定义了一个 API,用于从 XML 文档读取和写入Java对象。 JAXB 为Java开发人员提供了一种在 XML 和Java代码之间进行映射的有效且标准的方式。 JAXB 使开发人员可以更轻松地使用 XML 和 Web 服务技术扩展他们的应用程序。起初 JAXB 是作为一个单独的项目开发的,但最终在Java 6 中成为 JDK 的一部分。
JAXB的应用
JAXB 框架有助于执行以下操作:
- 将 XML 内容更改为Java表示。
- 访问和更新Java表示
- 将Java表示更改为 XML 内容。
JAXB 注释
JAXB 使用注释来指示中心元素。可以在您的Java类中用于 JAXB 操作的一些基本 JAXB 注释是:
Annotation | Description |
---|---|
@XmlRootElement | Must require annotation for the Object to be used in JAXB. It defines the root element for the XML content. |
@XmlType | It maps the class to the XML schema type. This is optional. We use @XmlType (propOrder = {“list of attributes in order”}) annotation to define Specific order of elements in XML file. |
@XmlTransient | To exclude a object from being mapped as part of the inheritance hierarchy you simply need to annotate it with @XmlTransient. |
@XmlAttribute | This will create the Object property as attribute. |
@XmlElement | It is used to define element in XML file.You can use @XmlElement(name = “Age”) if you want to give a specific name to that element. |
与 JAXB 相关的两个基本概念是:
- 编组:将Java对象转换为 xml
- UnMarshalling :将 xml 转换为Java对象
编组
以下是将Java对象转换为 XML(编组)的分步算法:
- 首先创建要编组的Java对象。
- 创建 JAXBContext 对象并初始化 Marshaller 对象。
- 要获得格式化的 xml 输出,可以将 JAXB_FORMATTTED_OUTPUT 设置为 True(此步骤是可选的)。
- 通过将文件的位置作为参数提供给文件类来创建 xml 文件对象
- 在 Marshaller 对象上调用 marshal 方法并将创建的 XML File 对象传递给 marshal 方法。
- 现在创建了 XML 文件。
示例:首先让我们创建一个具有 FullName、StudentDegree、StudentMarks 属性的 Student 对象,然后我们将按照上述步骤将该对象转换为 XML Schema。
创造学生。具有 FullName、StudentDegree、StudentMarks 属性的Java类。
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
// Below annotation defines root element of XML file
@XmlRootElement
public class Student {
private String FullName;
private String StudentDegree;
private String StudentMarks;
public String getFullName()
{
return FullName;
}
// Sets element of xml with element name is "Student Name"
@XmlElement(name = "Student Name")
public void setFullName(String fullName)
{
FullName = fullName;
}
public String getStudentDegree()
{
return StudentDegree;
}
@XmlElement(name = "Student Degree")
public void setStudentDegree(String studentDegree)
{
StudentDegree = studentDegree;
}
public String getStudentMarks()
{
return StudentMarks;
}
@XmlElement(name = "Student Marks")
public void setStudentMarks(String studentMarks)
{
StudentMarks = studentMarks;
}
}
主类:JAVAObjToXml。将 Student 对象转换为 XML Schema 的Java 。
import java.io.File;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class JAVAObjToXml {
public static void main(String[] args)
{
// creating Student object
Student student = new Student();
student.setFullName("Aman Singh");
student.setStudentDegree("Degree");
student.setStudentMarks("688/900");
try {
// Create JAXB context and initializing Marshaller
JAXBContext context = JAXBContext.newInstance(Student.class);
Marshaller marshaller = context.createMarshaller();
// For formatted output of xml
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// Create xml file object
File XMLfile = new File("D:\\StudentRecord.xml");
// Java object to XML file
marshaller.marshal(student, XMLfile);
// Print to console
marshaller.marshal(student, System.out);
}
catch (JAXBException e) {
e.printStackTrace();
}
}
}
输出:
generated StudentRecord.xml File for Student Object.
Aman Singh
Degree
688/900
使用 JAXB 的优缺点
优点:
- 易于将 XML 文件编组到其他数据目标,如 inputStream、DOM 节点。
- 易于从其他数据目标中解组 XML 文件。
- 无需了解 XML 解析技术。
- 比 DOM 或 SAX 解析器简单易用
缺点:
- JAXB 是高层 API,因此它对解析的控制比 SAX 或 DOM 少。
- 它比 SAX 慢。
参考:
- https://javaee.github.io/jaxb-v2/doc/user-guide/ch03.html#marshalling-sharing-prefixes
- https://docs.oracle.com/javase/tutorial/jaxb/intro/index.html