2011-09-22 29 views
1

我有以下XSD我用它來生成的JAXB對象JAXB解析 「minOccours」 - 問題與unmarshling

<xs:complexType name="packageType"> 
    <xs:sequence> 
     <xs:element ref="package" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element ref="dependencies" minOccurs="0"/> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:NMTOKEN" use="required"/> 
</xs:complexType> 

現在,如果我收到一個XML

  1. 沒有依賴標籤
  2. 依賴關係標記即

示例XML

<package id="FA33" required="false" empty="false"> 
    <dependencies /> 
</package> 

在上述例子中,如果刪除了「依賴性」空標籤,JAXB拋出「包的意外結束」錯誤。

由於minOccours在那裏,這兩種情況都不應該有所作爲。但在我的情況下,JAXB無法取消惡化給定的xml case1即,如果沒有依賴關係標記。如果有一個空的依賴關係標記,那麼它會很好。

它是預期的行爲還是它做錯了什麼?

P.S: 我使用JAXB 1.3

+1

JAXB 1參考實現的1.3版本相當陳舊。您是否可以升級到JAXB 2規範的實現:Metro,EclipseLink MOXy,Apache JaxMe等? –

+0

你在問這裏的依賴關係。在你發佈的代碼片段中有「依賴關係」。你可以發佈與依賴關係的片段嗎?也許你錯過了那裏的一些東西。 –

+0

升級到版本2目前不是一種選擇。這是一個錯誤,我已經解決了我的問題,將「依賴關係」替換爲「依賴關係」。還有一個樣本xml。 –

回答

3

如何使用JAXB 2?

JAXB 1用於在unmarshall上進行驗證。這是一個問題,因爲你無法真正解組無效的XML缺少強制性內容等

至於我記得,我用來解決此問題:

  • 註冊的「忽略」驗證處理程序
  • 生成模式派生類與JAXB-XJC的修補版本

該處理程序如下:

import javax.xml.bind.ValidationEventHandler; 

/** 
* Validation handler which ignores all the validation events. 
*/ 
public class IgnoringValidationEventHandler implements ValidationEventHandler { 

    /** 
    * Static instance. 
    */ 
    public static final ValidationEventHandler INSTANCE = new IgnoringValidationEventHandler(); 

    /** 
    * Simply returns <code>true</code> 
    * 
    * @param event 
    *   ignored; 
    * @return Always returns <code>true</code>. 
    */ 
    public boolean handleEvent(javax.xml.bind.ValidationEvent event) { 
     return true; 
    } 
} 

通過marshaller.setEventHandler(IgnoringValidationEventHandler.INSTANCE);進行註冊。

至於補丁jaxb-xjc,你可以通過valikov(at)gmx.net與我聯繫,我可以給你發送jar。

+0

問題在於這個JAXB jar被整個系統用在了多個類中。我不確定,更換一個jar會影響其他類或不。我可以嘗試處理程序的方法,而無需修改給定的jar? –

+0

那麼你可以嘗試,但在很多情況下,這仍然會失敗 - 例如使用強制元素和屬性。您應該更改生成類的jaxb-xjc JAR(運行時jaxb-impl不需要更改)。問題是,如果強制元素或屬性丟失,則「失敗」在生成的代碼中硬連線,該代碼基於有限自動裝置。當轉換失敗時,解析根本無法繼續。正如我所記得的,我攻擊了'jaxb-xjc'來製造更寬鬆的自動裝置。 – lexicore