📜  用于 XML 绑定 (JAXB) 的Java体系结构第一组

📅  最后修改于: 2022-05-13 01:55:41.306000             🧑  作者: Mango

用于 XML 绑定 (JAXB) 的Java体系结构第一组

XML 绑定的Java体系结构 (JAXB) 定义了一个 API,用于从 XML 文档读取和写入Java对象。 JAXB 为Java开发人员提供了一种在 XML 和Java代码之间进行映射的有效且标准的方式。 JAXB 使开发人员可以更轻松地使用 XML 和 Web 服务技术扩展他们的应用程序。起初 JAXB 是作为一个单独的项目开发的,但最终在Java 6 中成为 JDK 的一部分。

XML 绑定函数的Java体系结构

JAXB的应用

JAXB 框架有助于执行以下操作:

  • 将 XML 内容更改为Java表示。
  • 访问和更新Java表示
  • 将Java表示更改为 XML 内容。

JAXB 注释

JAXB 使用注释来指示中心元素。可以在您的Java类中用于 JAXB 操作的一些基本 JAXB 注释是:

AnnotationDescription
@XmlRootElementMust require annotation for the Object to be used in JAXB. It defines the root element for the XML content.
@XmlTypeIt 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.
@XmlTransientTo exclude a object from being mapped as part of the inheritance hierarchy you simply need to annotate it with @XmlTransient.
@XmlAttributeThis will create the Object property as attribute.
@XmlElementIt 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 相关的两个基本概念是:

  1. 编组:将Java对象转换为 xml
  2. UnMarshalling :将 xml 转换为Java对象

编组

以下是将Java对象转换为 XML(编组)的分步算法:

  1. 首先创建要编组的Java对象。
  2. 创建 JAXBContext 对象并初始化 Marshaller 对象。
  3. 要获得格式化的 xml 输出,可以将 JAXB_FORMATTTED_OUTPUT 设置为 True(此步骤是可选的)。
  4. 通过将文件的位置作为参数提供给文件类来创建 xml 文件对象
  5. 在 Marshaller 对象上调用 marshal 方法并将创建的 XML File 对象传递给 marshal 方法。
  6. 现在创建了 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();
        }
    }
}

输出

使用 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