1

我正在尝试使用 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 忽略这个问题,只生成忽略默认值的类?

4

1 回答 1

0

您的问题与类似(我刚刚使用相关信息对其进行了更新)。我不知道有什么方法可以告诉 JAXB 忽略它,因为这个错误发生在 XSD 模式处理器中(在 JAXB 的 xjc 开始实际工作之前)。

唯一的方法可能是过滤掉默认属性;但是,在这种情况下,很明显 XSD 设计器打算使用默认值 true,而生成的代码并非如此(Java 默认为 false)。

这可能会产生不必要的争吵,我的建议是与 XSD 提供商合作来修复它。

也许是一个侧边栏,但我个人认为在 XSD 中使用默认值是一个互操作性怪物:任何不依赖 XSD 的 XML 处理器的行为都会与依赖 XSD 的处理器不同。

于 2013-04-05T14:19:35.137 回答