JAXB解析“minOccurs” - 解组问题

时间:2011-09-22 19:16:50

标签: xml xsd jaxb unmarshalling

我遵循用于生成JAXB对象的XSD

<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. 依赖标记即
  3. 示例XML

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

    在上面的示例中,如果我删除“dependencies”空标记,JAXB会抛出“意外的包结束”错误。

    由于minOccours存在,这两种情况都不应该有所作为。但就我而言,JAXB无法解决 case1 中给定的xml,即如果没有依赖标记。如果有一个空的依赖关系标签,那么就可以了。

    是预期的行为还是做错了什么?

    P.S: 我正在使用Jaxb 1.3

1 个答案:

答案 0 :(得分: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与我联系,我可以把罐子寄给你。