jaxb - 如何从多态类创建 XML

作者:编程家 分类: xml 时间:2025-04-29

使用JAXB库可以将Java对象映射为XML文档,并且通过多态类的方式来创建XML文档。在本文中,我们将探讨如何使用JAXB从多态类创建XML,并提供一个案例代码来进行说明。

在Java中,多态类是指一个父类可以引用子类的对象。这意味着我们可以使用父类的引用来处理不同子类的对象。在JAXB中,我们可以利用多态类来将不同类型的Java对象动态地映射为XML。

首先,我们需要定义一个父类,它将作为多态类的引用类型。假设我们有一个动物类Animal,它有一个子类Cat和一个子类Dog。我们可以创建一个List,其中包含不同类型的Animal对象。

public class Animal {

// 省略其他属性和方法

}

public class Cat extends Animal {

// 省略其他属性和方法

}

public class Dog extends Animal {

// 省略其他属性和方法

}

List animals = new ArrayList<>();

animals.add(new Cat());

animals.add(new Dog());

接下来,我们需要创建一个包含所有可能的子类的ObjectFactory类。这个类将帮助JAXB在运行时确定要实例化的对象类型。

@XmlRegistry

public class ObjectFactory {

public Animal createAnimal() {

return new Animal();

}

public Cat createCat() {

return new Cat();

}

public Dog createDog() {

return new Dog();

}

}

现在我们可以使用JAXB的Marshaller来将这个多态类的List对象转换为XML文档。这里我们使用JAXB的注解来指定对象的映射规则。

JAXBContext context = JAXBContext.newInstance(ObjectFactory.class, Animal.class, Cat.class, Dog.class);

Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

ListWrapper wrapper = new ListWrapper();

wrapper.setAnimals(animals);

marshaller.marshal(wrapper, new File("animals.xml"));

在上述例子中,我们创建了一个ListWrapper类来包装Animals列表。这是因为JAXB不能直接将List对象映射为XML。通过创建一个包装类,我们可以将List对象映射为XML。

@XmlRootElement

public class ListWrapper {

private List animals;

@XmlElementRef

public List getAnimals() {

return animals;

}

public void setAnimals(List animals) {

this.animals = animals;

}

}

通过运行上述代码,我们可以将多态类的List对象转换为XML文档。以下是生成的XML文档的示例:

xml

这样,我们就成功地使用JAXB从多态类创建了XML文档。通过使用多态类和JAXB提供的注解,我们可以轻松地将不同类型的Java对象映射为XML。

案例代码:

java

import javax.xml.bind.JAXBContext;

import javax.xml.bind.JAXBException;

import javax.xml.bind.Marshaller;

import javax.xml.bind.annotation.XmlElementRef;

import javax.xml.bind.annotation.XmlRegistry;

import javax.xml.bind.annotation.XmlRootElement;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

public class PolymorphicXMLCreationExample {

public static void main(String[] args) {

List animals = new ArrayList<>();

animals.add(new Cat());

animals.add(new Dog());

try {

JAXBContext context = JAXBContext.newInstance(ObjectFactory.class, Animal.class, Cat.class, Dog.class);

Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

ListWrapper wrapper = new ListWrapper();

wrapper.setAnimals(animals);

marshaller.marshal(wrapper, new File("animals.xml"));

} catch (JAXBException e) {

e.printStackTrace();

}

}

public static class Animal {

// 省略其他属性和方法

}

public static class Cat extends Animal {

// 省略其他属性和方法

}

public static class Dog extends Animal {

// 省略其他属性和方法

}

@XmlRootElement

public static class ListWrapper {

private List animals;

@XmlElementRef

public List getAnimals() {

return animals;

}

public void setAnimals(List animals) {

this.animals = animals;

}

}

@XmlRegistry

public static class ObjectFactory {

public Animal createAnimal() {

return new Animal();

}

public Cat createCat() {

return new Cat();

}

public Dog createDog() {

return new Dog();

}

}

}

通过使用JAXB库,我们可以轻松地将多态类的Java对象映射为XML文档。在本文中,我们介绍了如何使用JAXB从多态类创建XML,并提供了一个案例代码来进行说明。通过使用JAXB的注解和ObjectFactory类,我们可以实现动态地将不同类型的Java对象转换为XML。这种方法为我们提供了一种方便的方式来处理多态类和XML之间的转换。