JAXB 解析“minOccours” - 解组问题

发布于 2024-12-05 18:30:41 字数 866 浏览 0 评论 0原文

我有以下用于生成 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. dependency 标记
  2. dependency 标记,即

示例 XML

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

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

由于 minOccours 存在,因此这两种情况都不会产生影响。但就我而言,JAXB 无法解压缩 case1 中给定的 xml,即如果没有依赖项标记。如果存在空的依赖项标签,那么一切都会顺利。

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

附: 我正在使用 Jaxb 1.3

I have following XSD which i used to generated JAXB objects

<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>

Now, If i receive an XML

  1. no dependency tag
  2. empty dependency tag i.e.

Sample XML

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

In the above example, If i remove the "dependencies" empty tag, JAXB throws "unexpected end of package" error.

Since the minOccours is there, both of these scenario shouldn't make a difference. But in my case, JAXB is unable to unmarsh the given xml in case1 i.e. if there is no dependency tag. If an empty dependencies tag is there then it goes fine.

Is it expected behavior or its doing something wrong?

P.S:
I am using Jaxb 1.3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅暮の光 2024-12-12 18:30:41

使用 JAXB 2 怎么样?

JAXB 1 用于验证解组。这是一个问题,因为您无法真正解组缺少强制元素等的无效 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发给你。

How about using JAXB 2?

JAXB 1 used to validate on unmarshall. This was a problem since you couldn't really unmarshall invalid XML with missing mandatory elements etc.

As far as I remember, I used to solve this problem by:

  • Registering an "ignoring" validation handler
  • Generating schema-derived classes with a patched version of jaxb-xjc

The handler is as follows:

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;
    }
}

Register it via marshaller.setEventHandler(IgnoringValidationEventHandler.INSTANCE);.

As for the patched jaxb-xjc, you may contact me via valikov(at)gmx.net, I can send you the jar.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文