1

java jaxb2.0用来做xml marshallingunmarshalling
我遇到了这样的问题。
示例 xml 是这样的* (fruit.xml) *:

<fruitPacks>
  <fruit name="apple1" type="apple" isApple="true"/>
  <fruit name="banana1" type="banana" isBanana="true"/>
  <fruit name="apple2" type="apple" isApple="true"/>
</fruitPacks>

和这样的java类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruitPacks")
@XmlRootElement
public class FruitPacks
{
   @XmlElement(name = "fruit")
   private List<Fruit> fruits
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruit")
@XmlSeeAlso({ Apple.class, Banana.class })
public class Fruit{
 @XmlAttribute
 private String name;
 @XmlAttribute
 private String type;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "apple")
public class Apple extends Fruit{
  @XmlAttribute
  private boolean isApple = true;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "banana")
public class Banana extends Fruit{
  @XmlAttribute
  private boolean isBanana = true;
}

和解组代码是:

public class JAXBTest {

public static void main(String [] args) throws Exception{
    JAXBContext jc = JAXBContext.newInstance(FruitPacks.class,Fruit.class,Apple.class, Banana.class);

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    Object obj = unmarshaller.unmarshal(new File("fruit.xml"));
    System.out.println(obj);
}   
}

所以我想要做的是:
在解组xml时,水果的构造将根据类型属性自动完成到子类(Apple,Banana)。
我该怎么做?

4

2 回答 2

2

您需要确保您JAXBContext知道子类。一种方法是使用@XmlSeeAlso注释,请参见下面的示例:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "fruit")
@XmlSeeAlso({Apple.class, Banana.class})
public class Fruit{
 @XmlAttribute
 private String name;
 @XmlAttribute
 private String type;
}

了解更多信息


更新

我刚刚意识到您使用的是type属性而不是标准xsi:type属性。对于任何 JAXB 实现,您都可以利用以下方式映射此用例XmlAdapter

如果您使用的是 EclipseLink JAXB (MOXy),那么您可以利用@XmlDescriminatorNode/@XmlDescriminatorValue扩展:

于 2012-05-15T10:25:53.410 回答
0

@Gang 尝试在标签 XML 中获取递归代码和 id 属性。:)

于 2012-05-15T06:24:46.867 回答