创建一个XSD来处理抽象类型

时间:2013-06-24 13:05:18

标签: jaxb abstract

关于jaxb抽象类型以及相关XML文档的使用,XML文档不能包含对抽象类型的引用 - 也就是说,XML必须使用具体类型。

示例(摘自here):

无效: < transport xmlns =" http://cars.example.com/schema" />

有效期: < transport xmlns =" http://cars.example.com/schema"的xmlns:=的xsi" HTTP://www.w3.org/2001/XMLSchema-instance"的xsi:type ="车载" />

(运输是抽象的)

Q值。我如何指示Jaxb取消编组,使其包含/填充" xsi:type"适当的价值?

顺便说一句,我所有的jaxb类都在同一个包中,我的JaxbContext是针对这个包配置的。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

<强>汽车

@XmlType注释可用于指定类型名称。

import javax.xml.bind.annotation.XmlType;

@XmlType(name="Car")
public class Car {

}

<强>演示

每当XML元素的Java类型为Object时,您的JAXB实现将使用xsi:type属性限定元素。下面我们将利用JAXBElement的实例进行此操作。

import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

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

        Car car = new Car();
        JAXBElement<Object> jaxbElement = new JAXBElement(new QName("transport"), Object.class, car); 

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

}

<强>输出

以下是运行演示代码的输出。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<transport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Car"/>