我正在尝试使用JAXB将无法控制的XSD转换为Java类。我得到的错误是:
[ERROR] cvc-pattern-valid: Value 'true' is not facet-valid with respect to pattern '0|1' for type 'BooleanType'.
line 139 of http://neon/meaweb/schema/common/meta/MXMeta.xsd
[ERROR] a-props-correct.2: Invalid value constraint value '1' in attribute 'mxencrypted'.
line 139 of http://neon/meaweb/schema/common/meta/MXMeta.xsd
XSD中包含错误的代码位于:
<xsd:complexType name="MXCryptoType">
<xsd:simpleContent>
<xsd:extension base="xsd:base64Binary">
<xsd:attribute name="changed" type="ChangeIndicatorType" use="optional" />
<xsd:attribute name="mxencrypted" type="BooleanType" use="optional" default="1" />
</xsd:extension>
</xsd:simpleContent>
具体来说,它是使用BooleanType的属性mxencrypted。 BooleanType定义为
<xsd:simpleType name="BooleanType">
<xsd:restriction base="xsd:boolean">
<xsd:pattern value="0|1" />
</xsd:restriction>
</xsd:simpleType>
从搜索周围来看,这似乎是一种常见的情况。据我所知,mxencrypted行中的默认值不应该是1?当我将XSD加载到Liquid XML时,架构不会报告错误。在此验证XSD(http://www.utilities-online.info/xsdvalidation/#.UV3zkL_EW0s)会报告与JAXB相同的错误。
有没有办法告诉JAXB忽略这个问题,只是生成忽略默认值的类?
答案 0 :(得分:0)
您的问题类似于this one(我刚刚用相关信息更新了它)。我不知道告诉JAXB忽略它的方法,因为这个错误发生在XSD架构处理器中(在JAXB的xjc开始实际工作之前)。
唯一的方法是过滤掉默认属性;但是,在这种情况下,显然XSD设计器的默认值为true,而生成的代码则不然(Java默认为false)。
这可能会产生不必要的骚扰,我的建议是与XSD提供商合作以解决问题。
也许是一个侧边栏,但我个人认为在XSD中使用默认值作为互操作性怪物:任何不依赖于XSD的XML处理器的行为都不同于那个。