JAXB 解析“minOccours” - 解组问题
我有以下用于生成 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
- 无 dependency 标记
- 空 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
- no dependency tag
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用 JAXB 2 怎么样?
JAXB 1 用于验证解组。这是一个问题,因为您无法真正解组缺少强制元素等的无效 XML。
据我记得,我曾经通过以下方式解决这个问题:
处理程序如下:
通过 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:
The handler is as follows:
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.