2011-09-22 50 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