【问题标题】:How to accept xsd vs xml validation when elements having null values当元素具有空值时如何接受 xsd 与 xml 验证
【发布时间】:2015-07-16 13:26:00
【问题描述】:

我有一个 xml,必须针对 xsd 验证结构和数据类型。但是 xml 中的某些字段具有空值/空值。但是当使用 JAXB 验证 xml 时

"cvc-datatype-valid.1.2.1: '' is not a valid value for 'integer'."

此异常是从带有链接 SaxParserError 异常的 JAXB 异常引发的。但我必须接受具有空值的 xml。这些线程 validating an XML schema with empty attributesElement type(long) without content 表明我们必须针对 xsd 修改 xml,以便它应该接受 null/empty 值。

有没有其他方法可以覆盖 ValidationHandler 类和 Unmarshaller 类的方法来接受空值。

【问题讨论】:

  • 失败的元素的架构定义是什么样的?
  • 什么是 XML 中的“空”值?如果您的 XSD 将元素指定为 xs:integer 类型,则该元素中的空值无效。没有办法解决这个问题。您可以将元素设为可选 (minOccurs="0") 并在 XML 中完全省略它。但最后,生产方应该改变,如果它产生这样的空元素。
  • @Seelenvirtuose 我已将 minoccurs = 0。但仍然抛出错误。 “cvc-datatype-valid.1.2.1: '' 不是 'integer' 的有效值。Null 表示空。是的空是无效的。但是如何接受。我不想更改此操作的 XML 模式。是有什么办法吗?
  • Errrrm ...当我说“没有办法解决这个问题”时,它是否如此模棱两可?此外,在声明 minOccurs="0" 时,这意味着可以省略该元素。如果它在那里,它仍然不能是空的。这就是 XSD 的目的。如果你不想让你的 XML 符合那个 XSD,那么就不要验证它!
  • 你为你的元素尝试过 nillable 选项吗? see here

标签: java xml validation parsing jaxb


【解决方案1】:

好吧,我猜你试图把

<myinteger></myinteger>

在您的 XML 中,但有一个 XSD,例如:

<element name="myinteger" type="integer" />

<element minOccurs="0" name="myinteger" type="integer" />

JAXB 是对的。在 XSD 验证方面,这是错误的,因此您必须更改 XML、更改 XSD 或禁用验证(仍然是错误的,但不会崩溃)。 MinOccurs="0" 表示接受该元素根本不存在(删除所有 myinteger 标记)。这并不意味着接受内容为空的标签。内容必须是整数。空字符串不是整数。

设置 nillable = true 也不起作用。这意味着这将被接受:

<myinteger xsi:nil="true"></myinteger>

但是你必须添加这个 xsi:nil="true"。

如果你确实想接受这个:

<myinteger></myinteger>

您可以按如下方式更改您的 XSD:

<element name="myinteger" type="IntegerOrNothing" />

<xsd:simpleType name="IntegerOrNoting">
    <xsd:union memberTypes="xsd:integer">
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="" />
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:union>
</xsd:simpleType>

如果您使用 Jaxb 从 XSD 生成 bean,则此类型的字段默认为 String 类型。然后,您将需要使用自定义绑定来获取整数字段。

【讨论】:

  • 还有一件事,我的 xml 具有作为整数的数据,它具有字符串或字符值,它具有空值。如何在没有 jaxb 中的 xsd 的情况下进行验证
  • 我不明白你的问题是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多