2011-03-30 75 views
5

我給XML,看起來像(當然其它更多的屬性):JAXB - 反編組態對象

<inventory> 
    <item kind="GRILL" tag=123 brand="WEBER"/> 
    <item kind="CAR" tag=124 make="FORD" model="EXPLORER" /> 
</inventory> 

有大約十幾個不同類型。我使用註釋映射到看起來像Java類:

@XmlRootElement(name="inventory") 
public class Inventory { 
    @XmlElement(name="item") 
    public List<Item> itemList = new LinkedList<Item>; 
} 
abstract public class Item { 
    @XmlAttribute public int tag; 
} 
public class Grill extends Item { 
    @XmlAttribute public string brand; 
} 
public class Car extends Item { 
    @XmlAttribute public string make; 
    @XmlAttribute public string model; 
} 

我怎樣才能得到JAXB創建基於「種類」字段的子類項目的對象?

+0

可能重複[Java/JAXB:Unmars大廳Xml基於特定的子類](http://stackoverflow.com/questions/2992234/java-jaxb-unmarshall-xml-to-specific-subclass-based-on-attribute) – 2011-03-30 23:21:06

+0

你是對的...我在發佈之前做了一次搜索,但不知何故錯過了它。 – dave 2011-03-30 23:34:12

回答

4

面積有幾種不同的方法:

JAXB(JSR-222)

下面的方法應該與任何JAXB實現(地鐵,莫西,JaxMe等)工作。使用適配對象包含父類和所有子類的屬性的XmlAdapter。在XmlAdapter中添加應該使用特定子類的邏輯。舉一個例子看到鏈接到以下類似的問題:

的EclipseLink JAXB(莫西)

您可以使用@XmlDescriminatorNode擴展在EclipseLink JAXB (MOXy)來處理這個用例。

看看我的回答類似的問題:

我們改進了的EclipseLink 2.2發佈這一支持:

+0

謝謝,這是一個很好的答案,但我必須得到IT人員的批准才能將其納入我們的服務器平臺。 – dave 2011-03-30 23:34:54

+0

同時,是否有任何使用適配器在標準版本中執行此操作的示例? – dave 2011-03-30 23:35:53

+0

雖然沒有標準的JAXB版本(只需要Java SE 6實現來提供JAXB impl),但我已經用一種適用於任何JAXB實現的方法更新了我的答案。 – 2011-03-31 01:27:49