2013-07-02 9 views
5

Với XML sauLàm thế nào để liên kết các thuộc tính phần tử con với các trường bằng JAXB?

<mappings> 
    <map> 
    <source srcAttr="oof">foo</source> 
    <target trgAttr="rab">bar</target> 
    </map> 
    <map> 
    ... 

Có thể với JAXB để unmarshal các <map> yếu tố thành một lớp duy nhất Map giá trị chứa thuộc tính của <source><target>?

@XmlRootElement 
class Map { 

    @XmlElement 
    String source; 

    @??? 
    String srcAttr; 

    @XmlElement 
    String target; 

    @??? 
    String trgAttr; 
} 

Tôi không muốn tạo thêm lớp cho Nguồn và mục tiêu.

Trả lời

2

Có! Chỉ cần thay thế ??? bằng @XmlAttribute chú thích.

Ngoài này có thể hữu ích jaxb example và điều này oracle examples

+0

Điều đó sẽ đặt các thuộc tính XML vào phần tử 'map' thay vì các phần tử' source' và 'target'. FYI - Đây là cách bạn có thể xử lý trường hợp sử dụng này bằng cách sử dụng phần mở rộng '@ XmlPath' của MOXy: http://stackoverflow.com/a/17424618/383861 –

+0

đặt các thuộc tính XML vào phần tử bản đồ thay vì các phần tử nguồn và đích - có vẻ như đó là những gì Udo muốn – Tala

+0

Vì tôi chỉ quan tâm đến việc không sửa đổi, đây chính là điều tôi muốn! Đã không nghĩ rằng nó sẽ được dễ dàng :-) – Udo

4

Lưu ý: Tôi là người dẫn đầu EclipseLink JAXB (MOXy) và là thành viên của nhóm JAXB (JSR-222) chuyên gia.

Bạn có thể sử dụng phần mở rộng @XmlPath MOXY để xử lý trường hợp sử dụng này:

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
class Map { 

    String source; 

    @XmlPath("source/@srcAttr") 
    String srcAttr; 

    String target; 

    @XmlPath("target/@trgAttr") 
    String trgAttr; 

} 

Để biết thêm thông tin

+2

Đây là sự sang trọng thực sự ;-) Thật không may tôi phải tuân theo tiêu chuẩn javee – Udo