【问题标题】:JAXB throws Error when unmarshalling empty int, double or date attributes解组空 int、double 或 date 属性时 JAXB 抛出错误
【发布时间】:2013-06-04 06:35:51
【问题描述】:

我在 JAXB 解组 xml 数据时遇到了问题。

当从 xml 解组 intdoubledate 属性的空值时,JAXB 会引发异常。例如,它在解组以下 xml 数据时抛出 java.lang.NumberFormatException

<sku displayName="iphone" price=""/>

以下是我的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="sku" type="SkuType" maxOccurs="unbounded"/>
    <xs:complexType name="SkuType">
        <xs:attribute name="displayName" type="xs:string" use="required"/>
        <xs:attribute name="price" type="xs:double" use="required"/>
        <xs:attribute name="startDate" type="xs:dateTime" use="optional"/>
        <xs:attribute name="minimumOrderQty" type="xs:integer" use="optional"/>
    </xs:complexType>
</xs:schema>

对于混乱的 xml 感到抱歉。我无法在输入中输入“左角”符号。谁能帮帮我?

非常感谢。

【问题讨论】:

  • 使用上面的代码图标格式化 XML 会更好看。
  • 非常感谢。你用的是什么代码图标?
  • 使用 0s 和 1s (010101) 等按钮

标签: java xsd jaxb


【解决方案1】:

由于空字符串 "" 不是有效的双精度数,因此引发错误。如果需要价格,则必须为其分配一个有效的双精度值。

您应该设置一个类似于 price="0" 的值,或者将属性设为可选,而不是 price=""。

有效的价格属性:

<sku displayName="iphone" price="0"/>

价格属性作为可选属性:

<xs:attribute name="price" type="xs:double" use="optional"/>

【讨论】:

  • Dunderklumpen,感谢您的帮助。我不允许更改 xml 数据。但是,即使我将属性设置为可选,我仍然有同样的异常。 startDate="" 或 minimumOrderQty="" 也会得到异常。你知道我可以做些什么来强制 JAXB 接受空值作为有效值吗?谢谢
  • 当 XML 违反 XSD 时,您无法解析它。您需要更改 XSD 定义以使价格属性成为字符串。 JAXB 会将其解析为字符串属性。然后可以在 JAXB 解析之后进行字符串到数字的转换,此时可以将有效数字从字符串转换为数字。
  • 具体来说,你应该将属性 price 更改为 type="xs:string"
  • 我明白了。设置默认值也不起作用。我认为您的解决方案-更改为字符串类型是唯一的方法。非常感谢。我真的很感激你的帮助。
  • 不幸的是,它不是 JAXB 的问题,而是基本的 XML 问题。 JAXB 对需要有效的 XML 非常严格(这也是正确的)。如果 XSD 是由提供 XML 的人提供的,他们应该被告知值 "" 对于数字和日期类型是不合法的。
【解决方案2】:

您可以将价格属性类型限制为空字符串和整数值的联合。虽然这仍会将价格属性映射到 XML 模式的字符串验证,但将检查只有空字符串和整数作为价格属性的值是有效的。这是架构示例:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="product" type="product"/>

   <xsd:complexType name="product">
      <xsd:attribute name="name" type="xsd:string"/>
      <xsd:attribute name="price" type="emptyInt"/>
   </xsd:complexType>

   <xsd:simpleType name="emptyInt">
      <xsd:union>
         <xsd:simpleType>
            <xsd:restriction base="xsd:integer"/>
         </xsd:simpleType>
         <xsd:simpleType>
            <xsd:restriction base="xsd:token">
               <xsd:enumeration value=""/>
            </xsd:restriction>
         </xsd:simpleType>
      </xsd:union>
   </xsd:simpleType>
</xsd:schema>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    相关资源
    最近更新 更多