JAXB编译器和属性顺序

时间:2009-11-30 19:00:08

标签: java jaxb attributes

我想控制JAXB编译器生成的.java文件中的属性顺序。

我知道属性顺序对于xml验证并不重要。该顺序对于在回归测试环境中对编组的xml进行文本比较非常重要。文件中的属性顺序直接影响编组的xml标记中的属性顺序。

每次运行JAXB编译器时,即使没有更改架构,属性组也会以不同的顺序出现。编译器上没有明显的选项可以防止这种行为。

我想避免运行后编译脚本按字母顺序重新排序生成的.java文件中的属性,因为这会破坏属性组,但我不确定还有其他选项。

非常感谢任何建议。

谢谢, 戴夫

4 个答案:

答案 0 :(得分:4)

显然,在JAXB 2.0中你可以使用注释@XmlAccessorOrder或@XmlType(propOrder =)

答案 1 :(得分:1)

我建议使用XML解析器验证输出,而不是进行文本比较。如果你要解析xml来重新排序它,你也可以使用XML工具进行比较。

编辑: 尝试通过操纵Java源代码顺序来控制生成的XML似乎是一种脆弱的处理方式。当然,这仅用于测试,因此如果出现问题,代码可能仍然可以正常工作。人们一直在改变源代码顺序,有时是偶然的,如果你不得不依赖某种顺序,它将是烦人的或者是一个微妙的问题来源。

至于使用XML工具比较XML数据的方法,我从未亲自大规模地完成这项工作,但this link mentions a few free tools。对我来说,提供与XML相关的断言的JUnit的扩展将是我的第一步,因为它可以与我现有的测试很好地集成。否则,由于您主要寻找完全等价,您可以解析两个XML文件,然后迭代'expected'文件中的节点,看看这些节点是否存在于'actual'文件中。然后只检查您不希望看到的任何其他节点。

答案 2 :(得分:1)

如果您需要对XML文档进行文本比较,那么有更好的方法可以实现,而不是尝试控制不区分属性排序的XML框架的输出。

例如,有XMLUnit,这是一个专门针对XML断言的junit扩展,它处理空白并排序很好。

更通用的解决方案是XOM's Canonicalizer,它输出XML DOM,以便属性排序和空格是可预测的。非常方便。

所以......让JAXB(或其他)按照自己认为合适的方式生成XML,然后通过XMLUnit或XOM运行输出,并进行比较。这具有不依赖于JAXB的附加优点,它可以与任何生成的XML一起使用。

答案 3 :(得分:0)

这个帖子为我的问题提供了很好的解决方案。

Using XSL to sort attributes

其中一个答案包含一个只重新排序属性的xsl变换。如果有点慢,可以很好地工作。