我想控制JAXB编译器生成的.java文件中的属性顺序。
我知道属性顺序对于xml验证并不重要。该顺序对于在回归测试环境中对编组的xml进行文本比较非常重要。文件中的属性顺序直接影响编组的xml标记中的属性顺序。
每次运行JAXB编译器时,即使没有更改架构,属性组也会以不同的顺序出现。编译器上没有明显的选项可以防止这种行为。
我想避免运行后编译脚本按字母顺序重新排序生成的.java文件中的属性,因为这会破坏属性组,但我不确定还有其他选项。
非常感谢任何建议。
谢谢, 戴夫
答案 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)