2009-05-07 23 views
6

Tôi đang phân tích một tài liệu XML có các nút như sau:Sử dụng JAXB để unmarshall yếu tố khác nhau với/tên động

<objects> 
    <dog> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </dog> 
    <cat> 
    <data1>...</data1> 
    <data2>...</data2> 
    <data3>...</data3> 
    </cat> 
</objects> 

Các yếu tố data1, data2, data3 luôn nhất quán. Chỉ có thẻ cha thay đổi. Trong mô hình đối tượng của tôi, tôi có một đối tượng đại diện cho tất cả các trường hợp này. Làm thế nào tôi có thể nhận được JAXB để xử lý trường hợp này mà không biết trước tên của phần tử?

@XMLAnyElement khớp với tất cả các đối tượng nhưng không tạo đối tượng thuộc loại thích hợp; Tôi nhận được một danh sách các đối tượng Nút thay vì đối tượng của tôi. đối tượng của tôi hiện trông giống như sau:

public class MyObject { 
    protected String otherData; 

    @XmlAnyElement 
    @XmlElementWrapper(name = "objects") 
    protected List<MyChildObject> childObjects; 
} 

public class MyChildObject { 
    protected String data1; 
    protected String data2; 
    protected String data3; 
} 

Bất kỳ ý tưởng làm thế nào để xử lý trường hợp này ngắn của việc thay đổi định dạng XML đến sử dụng <object type="dog"> yếu tố?

Trả lời

6

Nếu tên thật là động, thì tôi không nghĩ JAXB sẽ giúp bạn những điều này. Nếu bạn có một số định nghĩa của các tên phần tử khác nhau thì bạn có thể sử dụng thừa kế như bài viết khác được đề xuất. Nếu không biết số lượng phần tử và tên, tôi khuyên bạn nên sử dụng một cái gì đó như thế này:

@XmlMixed 
@XmlAnyElement 
public List<Object> getObjects() { 
    return objects; 
} 

Điều này sẽ mang yếu tố này chỉ là một phần tử DOM. Sau đó bạn có thể sử dụng JAXB lần thứ hai để chuyển từ mỗi phần tử sang loại tùy chỉnh của bạn.

Điều đó sẽ xảy ra nếu bạn phải sử dụng JAXB. Bạn có thể thấy dễ dàng hơn khi chỉ sử dụng SAX hoặc DOM API trực tiếp cho dữ liệu như thế này. JAXB thực sự dành cho dữ liệu được xác định rõ ràng có thể được biểu diễn dưới dạng lược đồ.

+0

Cảm ơn, điều đó có ý nghĩa. Chúng ta sẽ tiếp tục và thay đổi lược đồ vì chúng ta có khả năng đó trong lúc này. – chetan

0

Bạn có thể sử dụng thừa kế:

@XmlRootElement(name = "dog") 
public class MyDogObject extends MyChildObject { 
    //nothing here 
} 

@XmlRootElement(name = "cat") 
public class MyCatObject extends MyChildObject { 
    //nothing here 
} 

Bằng cách này nó cho phép bạn đối phó với các loại cùng một đối tượng, MyChildObject, nhưng linh hoạt điều khiển cấu trúc XML. Một lợi ích khác là bạn nên xác định các nút XML con chó/mèo cụ thể trong tương lai - chúng có thể được ánh xạ trên lớp con tương ứng nhưng không phải là nút con khác, như mong đợi.

+0

Điều này giả định rằng tôi biết trước vũ trụ của tên đối tượng để tôi có thể tạo các lớp con. Hiện tại tôi đang làm, nhưng nó có vẻ như là một sự lãng phí. – chetan

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