2013-06-24 6 views
1

Что касается абстрактных типов jaxb и потребления связанных документов XML, XML-документ не может содержать ссылку на абстрактный тип - то есть XML должен использовать конкретный тип.Создайте XSD для обработки абстрактных типов

Пример (взят из here):

Недопустимые: < транспорта XMLNS = "http://cars.example.com/schema" />

Действительно: < транспорта XMLNS = "HTTP : //cars.example.com/schema "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "xsi: type =" Car "/>

(где транспорт является абстрактным)

В. Как c я инструктирую Jaxb на unmarshall, чтобы он включал/заполнял значение «xsi: type» соответствующим образом?

Btw, все мои классы jaxb находятся в том же пакете, и мой JaxbContext настроен на этот пакет.

ответ

1

Вы можете сделать следующее:

автомобилей

@XmlType аннотаций можно использовать для указания имени типа.

import javax.xml.bind.annotation.XmlType; 

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

} 

Demo

Всякий раз, когда тип Java для элемента XML является 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"/>