JAXB编译器和属性顺序

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

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

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

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

任何建议都非常感谢。

谢谢,戴夫

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

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

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

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

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

例如,有XMLUnit ,它是一个专门用于XML断言的junit扩展,它可以很好地处理空白和排序。

更通用的解决方案是XOM的 Canonicalizer ,它输出XML DOM,使得属性排序和空白是可预测的。 非常便利。

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

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

使用XSL对属性进行排序

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