簡體   English   中英

如何使用@XmlElement和@XmlRootElement來編組對象內的對象?

[英]How to use @XmlElement and @XmlRootElement for marshalling object inside an object?

我已經看到了JAXB的許多實現,我們可以使用@XmlElement注釋將java原語轉換為XML元素。

但是,我想將以下POJO轉換為XML(注意員工類中有一個地址對象 ,而不僅僅是原語):

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

    // constructors + setters + getters
}

如何使用這些JAXB注釋將員工對象編組為XML?

謝謝。

你需要做的就是編組一個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;
    }

}

地址

作為Employee一部分,將Address編組,您無需做任何特殊操作。

public class Address {

    private String street;

    public String getStreet() {
        return street;
    }

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

}

演示代碼

下面是一些演示代碼,它將填充和員工模型並將其編組為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);
    }

}

產量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <address>
        <street>1 A Street</street>
    </address>
    <employeeId>123</employeeId>
</employee>

重命名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;
    }

}

產量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
    <ADDR>
        <street>1 A Street</street>
    </ADDR>
    <ID>123</ID>
</employee>

使用Jaxb,您可以嘗試以下代碼。 或者,您可以嘗試Xstream

  @XmlRootElement
public class TestObject {

    String a;

    TestObject1 anotherObject;
    public String getA() {
        return a;
    }
    @XmlElement
    public void setA(String a) {
        this.a = a;
    }


    public TestObject1 getAnotherObject() {
        return anotherObject;
    }
    @XmlElement
    public void setAnotherObject(TestObject1 anotherObject) {
        this.anotherObject = anotherObject;
    }
    public static void main(String[] args) throws JAXBException {
        TestObject object = new TestObject();
        object.setA("A");
        TestObject1 anotherObject = new TestObject1();
        anotherObject.setB("B");
        object.setAnotherObject(anotherObject);
        File file = new File("output.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(TestObject.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        jaxbMarshaller.marshal(object, file);
        jaxbMarshaller.marshal(object, System.out);
    }
}

========================

@XmlRootElement
public class TestObject1 {

    String b;

    public String getB() {
        return b;
    }

    @XmlElement
    public void setB(String b) {
        this.b = b;
    }

}

通過下面給出的@XmlRootElement (即通過使用@XmlRootElement注釋注釋兩個類),我能夠使用JAXB實現“對象內部對象”XML編組:

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

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

@XmlRootElement
public class Address {
    .
    .
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM