![](/img/trans.png)
[英]How to change the name of the XmlRootElement in JAXB deppending on the object?
[英]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
進行注釋。
雇員
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>
如果要覆蓋默認元素名稱,則可以使用@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.