我必须使用大型XML文档,这些文档通常会错误地处理缺少的属性数据。不是仅仅使用缺少的数据省略属性,而是使用空字符串值指定属性。这在解组时会导致问题,因为空字符串 是一个值。
例如,应该是什么
<SOME_ELEMENT attr1="someValue"/>
而不是
<SOME_ELEMENT attr1="someValue" attr2="" attr3=""/>
我正在尝试用“正确”的方式优雅地处理这个格式错误的XML。目标是在属性的值为空字符串时将属性视为省略,并且空字符串永远不是该属性的有效值(例如,整数)。
我目前正在使用XMLAdapters将这些空字符串转换为null(如建议的in this post),但这似乎是错误的解决方案。我正在使用的文档中的许多属性已经在使用从其他代码共享的类型适配器,并且似乎没有办法为属性指定多个XMLAdapter。
有没有一种标准方法来处理我刚刚错过的这种情况?
谢谢!
修改
我正在寻找一个不需要我编辑各种JAXB映射类的解决方案,因为有几十个都有相同的需求。理想情况下,此问题的解决方案将允许我为所有属性指定一般策略,并允许根据需要进行特定覆盖。
答案 0 :(得分:0)
我认为你想要遵循的模式是这篇文章: Customizing error handling of JAXB unmarshall process
使用元素,XML可以指定它为null(如下所示)。对于字符串类型,空元素和属性(有时缺少元素)可以解释为空字符串。因此,您必须将您的逻辑视为业务逻辑,即使用afterUnmarshal事件处理。
<foo xsi:nil="true" />
答案 1 :(得分:0)
由于现在已经休眠了一段时间,我不妨回答一下我们在哪里停下来的问题。
在说明中的链接中,Skaffman的回答JAXB: how to make JAXB NOT to unmarshal empty string to 0似乎是最好的选择。