JAXB解析 “minOccours” - 问题与unmarshling
我有以下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
- 没有依赖标签
- 空依赖关系标记即
示例XML
<package id="FA33" required="false" empty="false">
<dependencies />
</package>
在上述例子中,如果删除了“依赖性”空标签,JAXB抛出“包的意外结束”错误。
由于minOccours在那里,这两种情况都不应该有所作为。但在我的情况下,JAXB无法取消恶化给定的xml case1即,如果没有依赖关系标记。如果有一个空的依赖关系标记,那么它会很好。
它是预期的行为还是它做错了什么?
P.S: 我使用JAXB 1.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。
问题在于这个JAXB jar被整个系统用在了多个类中。我不确定,更换一个jar会影响其他类或不。我可以尝试处理程序的方法,而无需修改给定的jar? –
那么你可以尝试,但在很多情况下,这仍然会失败 - 例如使用强制元素和属性。您应该更改生成类的jaxb-xjc JAR(运行时jaxb-impl不需要更改)。问题是,如果强制元素或属性丢失,则“失败”在生成的代码中硬连线,该代码基于有限自动装置。当转换失败时,解析根本无法继续。正如我所记得的,我攻击了'jaxb-xjc'来制造更宽松的自动装置。 – lexicore
JAXB 1参考实现的1.3版本相当陈旧。您是否可以升级到JAXB 2规范的实现:Metro,EclipseLink MOXy,Apache JaxMe等? –
你在问这里的依赖关系。在你发布的代码片段中有“依赖关系”。你可以发布与依赖关系的片段吗?也许你错过了那里的一些东西。 –
升级到版本2目前不是一种选择。这是一个错误,我已经解决了我的问题,将“依赖关系”替换为“依赖关系”。还有一个样本xml。 –