2013-06-24 71 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解除封裝,使其適當地包含/填充「xsi:type」值?

順便說一下,我所有的jaxb類都在相同的包中,並且我的JaxbContext是針對此包進行配置的。

回答

1

你可以做到以下幾點:

汽車

@XmlType註解可以用來指定類型名稱。

import javax.xml.bind.annotation.XmlType; 

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

} 

演示

每當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"/>