2012-03-16 75 views
3

我必须处理大型XML文档,这些文档通常会错误地处理缺少的属性数据。而不是仅仅遗漏缺少数据的属性,该属性用空字符串值指定。这会导致解组时出现问题,因为空字符串的一个值。使用JAXB将空字符串解组为空的正确方法

例如,应该是什么

<SOME_ELEMENT attr1="someValue"/> 

反而

<SOME_ELEMENT attr1="someValue" attr2="" attr3=""/> 

我试图拿出适当地处理这个不好的XML的“正确”的方式。我们的目标是将属性的值视为空白字符串时省略,而空白字符串永远不会是该属性的有效值(例如整数)。

我目前使用XMLAdapters将这些空字符串转换为空(如建议in this post),但这似乎是错误的解决方案。我正在使用的文档中的许多属性已经使用了从其他代码共享的类型适配器,并且似乎没有为属性指定多个XMLAdapter的方法。

有没有一种标准的方法来处理我刚刚错过的这种类型的情况?

谢谢!

编辑

我在寻找,不需要我来编辑每个不同的JAXB的解决方案映射类,因为有几十个都具有相同的需求。理想情况下,这个问题的解决方案将允许我为所有属性指定一个通用策略,并根据需要允许特定的覆盖。

+0

你想要什么样的行为?你想要绑定的栏值为零或空或空字符串,或其他完全? – 2012-04-10 14:37:22

+0

还有什么问题http://stackoverflow.com/questions/5133250/jaxb-how-to-make-jaxb-not-to-unmarshal-empty-string-to-0?这是一个语义问题,而不是xml语法问题。 xml实际上是格式良好的。我这样说是因为这意味着它不会是一个优雅的技术解决方案,因为它是一个业务逻辑问题。 – 2012-04-10 14:40:32

+0

的行为应该是将关联的JAXB映射类中“bar”的值设置为null,这将视为该属性被省略。海事组织,业务逻辑是不同的事情。我期望处理生成的JAXB对象树的代码负责业务逻辑(例如,如果省略了特定值,则拒绝XML文档)。我在寻找的是一种全面的方式来处理所有空属性值,其中空值永远不会有效,就好像它们被省略一样。也许这种行为应该被视为商业逻辑? – Terence 2012-04-10 19:24:00

回答

0

我认为模式要遵循的模式是,在这个帖子: Customizing error handling of JAXB unmarshall process

与元素,XML可以指定它为空(如下)。对于字符串类型,空元素和属性(有时缺少元素)可以被解释为空字符串。因此,您必须将您的逻辑视为业务逻辑,这是使用afterUnmarshal事件处理的。

<foo xsi:nil="true" /> 
+0

不幸的是,这个例子是基于元素的,而不是基于属性的(我的问题是关于属性的)。此外,post中建议的afterUnmarshal方法不允许我确定是否从空字符串或合法值(例如,值为1的整数)解析了非字符串值。 – Terence 2012-04-09 14:46:38

+0

我的一个观点是,只有xml元素可以为null,但这对你没有帮助。你能更具体地了解你的情况吗?元素是什么,属性是什么? – 2012-04-09 23:37:03

+0

我在那里有点不清楚,对此感到遗憾。我已经更新了描述 – Terence 2012-04-10 06:39:49

相关问题