2011-03-30 78 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