2012-02-15 121 views
6

我想使用JAXB 2.1 XJC從xsd生成java代碼。我提供了一個xsd模式,我無法更改它。我想在使用xml模式生成java類時使用xjc:simple模式。JAXB 2.1 - 自定義xs:任何綁定

在XSD有元素:

<xs:any namespace="##other" processContents="lax"/> 

正如本文指出:http://jaxb.java.net/guide/Mapping_of__xs_any___.html我預計,這些元素將被綁定到:

@XmlAnyElement(lax=true) 
public Object any; 

但是當我使用簡單的結合模式xjc:簡單我有:

@XmlAnyElement 
protected Element any; 

我試圖找到一種解決方法,但是到處都有人說xs:any是在沒有配置的情況下處理的。將xs:any元素作爲java.lang.Object的唯一方法是在xsd中將xjc:簡單或更改processContents設置爲「strict」。現在我無法接受這些選項,因爲我無法更改xml模式,而且我有一些遺留代碼依賴於使用xjc生成的java類:簡單模式,但現在我需要使用xs:any元素,並且我希望避免使用org.w3c.dom.Element對象。

任何幫助將不勝感激。謝謝。

回答

5

您可以使用JAXB2 BasicsWildcard plugin。這允許您自定義鬆懈/跳/嚴格通配符結合模式:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:wildcard="http://jaxb2-commons.dev.java.net/basic/wildcard" 
    jaxb:version="2.1" 
    jaxb:extensionBindingPrefixes="wildcard"> 

... 

    <xs:complexType name="issueJIIB10Type" mixed="true"> 
     <xs:annotation> 
      <xs:appinfo> 
       <wildcard:lax/> 
      </xs:appinfo> 
     </xs:annotation> 
     <xs:complexContent mixed="true"> 
      <xs:extension base="xs:anyType"/> 
     </xs:complexContent> 
    </xs:complexType> 

... 

</xs:schema> 

你不必改變這個模式,你可以通過綁定文件中使用這種定製。

+0

我什至讀過這個插件,但不知道這是否是正確的方向。感謝您的答覆 - 我會盡快在項目中有一些閒暇時間來驗證。 – arek 2012-03-08 11:36:30

+1

謝謝lexicore,這個插件幾乎是我所需要的。我之所以這樣說,幾乎是因爲我找不到一種方法來全局更改所有的xs:any到java.lang.Object。每種情況都必須單獨配置,有點煩人。只需要記錄任何可能需要通過綁定文件配置它的人(插件doc根本不包括這種情況),則必須直接指向複雜類型,例如: arek 2012-03-12 15:43:56

+0

@Arek請在JAXB2基礎知識中提出問題,是可行的。 – lexicore 2012-03-12 17:37:30