如何使用@XmlElement和@XmlRootElement来编组对象内的对象?

Aks*_*kur 12 java xml jaxb

我已经看到了JAXB的许多实现,我们可以使用@XmlElement注释将java原语转换为XML元素.

但是,我想将以下POJO转换为XML(注意员工类中有一个地址对象,而不仅仅是原语):

public class Employee {
    private Address address;
    private int employeeId;

    // constructors + setters + getters
}
Run Code Online (Sandbox Code Playgroud)

如何使用这些JAXB注释将员工对象编组为XML?

谢谢.

bdo*_*han 23

你需要做的就是编组一个POJO属性,而不是编组一个原始属性.引用的POJO类不需要注释@XmlRootElement.

Java模型

雇员

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Employee {

    private Address address;
    private int employeeId;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

}
Run Code Online (Sandbox Code Playgroud)

地址

没有什么特别的事情可以让你Address作为一部分进行编组Employee.

public class Address {

    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}
Run Code Online (Sandbox Code Playgroud)

演示代码

下面是一些演示代码,它将填充和员工模型并将其编组为XML.

演示

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Employee.class);

        Address address = new Address();
        address.setStreet("1 A Street");

        Employee employee = new Employee();
        employee.setEmployeeId(123);
        employee.setAddress(address);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(employee, System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <address>
        <street>1 A Street</street>
    </address>
    <employeeId>123</employeeId>
</employee>
Run Code Online (Sandbox Code Playgroud)

重命名Marshalled Element

如果要覆盖默认元素名称,则@XmlElement无论属性的类型如何,都可以使用注释.

雇员

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Employee {

    private Address address;
    private int employeeId;

    @XmlElement(name="ADDR")
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @XmlElement(name="ID")
    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <ADDR>
        <street>1 A Street</street>
    </ADDR>
    <ID>123</ID>
</employee>
Run Code Online (Sandbox Code Playgroud)


Aks*_*kur 4

我能够通过下面给出的方法使用 JAXB 实现“对象内对象”XML 编组(即通过使用@XmlRootElement注释对两个类进行注释):

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Employee {
    @XmlElement
    private Address address;
     .
     .
}

@XmlRootElement
public class Address {
    .
    .
}
Run Code Online (Sandbox Code Playgroud)