1

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

示例(取自此处):

无效:<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="Car"/>

(运输是抽象的)

问:我如何指示 Jaxb 解组,以便它适当地包含/填充“xsi:type”值?

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

4

1 回答 1

1

您可以执行以下操作:

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

import javax.xml.bind.annotation.XmlType;

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

}

演示

只要 XML 元素的 Java 类型是,那么您的 JAXB 实现就会使用该属性Object来限定元素。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"/>
于 2013-06-24T13:23:21.560 回答