JAXB可以初始化基类中的值吗?

时间:2011-12-02 13:14:37

标签: java xml jaxb xml-parsing

我正在开发一个Scala项目,我们希望使用XML来使用JAXB(而不是Spring)初始化我们的对象。我有一个层次结构,在子类中添加更多的数据成员。一个简单的例子看起来像这样:

class Animal
{
   string name
}

class Cat extends Animal
{
   int numLives
}

class Dog extends Animal
{
   bool hasSpots
}

我希望能够从XML块初始化动物列表,如下所示:

<Animals>
   <Cat>
      <name>Garfield</name>
      <numLives>9</numLives>
   </Cat>
   <Dog>
      <name>Odie</name>
      <hasSpots>false</hasSpots>
   </Dog>
</Animals>

我们如何在类中设置注释以便能够处理这个?

2 个答案:

答案 0 :(得分:3)

对于此示例,您需要使用@XmlElementRef@XmlRootElement注释。这对应于替换组的XML模式概念。这将允许您具有由元素区分的继承层次结构中的对象列表。

<强>动物

这将作为域模型的根对象。它有List属性,注明@XmlElementRef。这意味着它将根据其@XmlRootElement注释的值匹配值。

package forum8356849;

import java.util.List;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Animals")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Cat.class, Dog.class})
public class Animals {

    @XmlElementRef
    private List<Animal> animals;
}

<强>动物

package forum8356849;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
class Animal
{
   String name;
}

<强>猫

我们将使用Cat注释对@XmlRootElement类进行注释。这与@XmlElementRef上的Animals注释一起使用。

package forum8356849;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Cat")
class Cat extends Animal
{
   int numLives;
}

<强>狗

我们还会在@XmlRootElement类中添加Dog注释。

package forum8356849;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Dog")
class Dog extends Animal
{
   boolean hasSpots;
}

<强>演示

您可以使用以下类来查看一切都按预期工作。 input.xml对应于您问题中提供的XML。

package forum8356849;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Animals.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum8356849/input.xml");
        Animals animals = (Animals) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(animals, System.out);
    }

}

更多信息

答案 1 :(得分:0)

在这种情况下,我更喜欢创建XSD架构并从中生成代码,因此您可以放心使用。 但要回答你的问题,是的,你可以。注释是XMLElement,XMLAttribute,XMLRootElement。