2011-02-02 41 views
14

Tôi cần trợ giúp một chút với Chú thích JAXB và tôi không thể tìm thấy tài liệu hay giúp tôi tìm ra điều này.Chú thích JAXB

Tôi có một lớp học mà tôi muốn sắp xếp thành XML. Lớp của tôi trông như thế này:

@XmlRootElement(name="car") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
    "vid", 
    "make", 
    "model", 
    "recalls", 
    "engSpec" 
}) 

public class Car { 
    @XmlElement(name="vid", required=true) 
    private String vid; 
    @XmlElement(name="make", required=true) 
    private String make; 
    @XmlElement(name="model", required=true) 
    private String model; 
    @XmlElement(name="recalls", required=true) 
    private ArrayList<Recall> recalls; 
    @XmlElement(name="engSpec", required=true) 
    private EngSpec engSpec; 
... 

Và lớp thu hồi trông như thế này:

@XmlRootElement(name = "recall") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
     "type", 
     "date" 
}) 
public class Recall { 
    @XmlElement(name="type", required=true) 
    private String type; 
    @XmlElement(name="date", required=true) 
    private String date; 
... 

Vì vậy, nó tạo ra XML này:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
</recalls> 
<recalls> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

Nhưng những gì tôi muốn ArrayList để hiển thị khác, như sau:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <recall> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
    </recall> 
    <recall> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
    </recall> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

Bất kỳ ý tưởng làm thế nào tôi có thể làm điều này? Tôi nghĩ rằng vấn đề là với lược đồ của tôi, nhưng tôi sử dụng vấn đề này cho marshalling:

JAXBContext jc = JAXBContext.newInstance(Car.class); 
Marshaller marsh = jc.createMarshaller(); 
marsh.marshal(car, out); 

Bất kỳ ý tưởng nào để sửa lỗi này? Cảm ơn!

+5

Nhân tiện, nếu tên thuộc tính bean của bạn giống với phần tử XML, bạn không cần phải chỉ định chú thích '@ XmlElement' ... lưu toàn bộ chuỗi nhập. :) – limc

Trả lời

31

Hãy thử điều này:

@XmlRootElement(name="car") 
... 
public class Car { 
    ... 

    @XmlElementWrapper(name="recalls") // this name=... can be omitted, as it 
             // is the same as the field name 
    @XmlElement(name="recall") 
    private ArrayList<Recall> recalls; 
} 

Từ documentation:

XmlElementWrapper: Tạo một yếu tố bao bọc xung quanh đại diện XML. Điều này chủ yếu được sử dụng để tạo ra một phần tử XML bao quanh các bộ sưu tập.

+1

Tuyệt vời, điều này làm việc tuyệt vời! Cảm ơn bạn! –

Các vấn đề liên quan