2009-11-30 58 views
5

我想控制由JAXB編譯器生成的.java文件中的屬性順序。JAXB編譯器和屬性順序

我知道屬性順序對於xml驗證並不重要。順序對於迴歸測試環境中編組xml的文本比較非常重要。文件中屬性的順序直接影響編組xml標籤中屬性的順序。

每次運行JAXB編譯器時,即使不更改架構,屬性組也會以不同的順序出現。編譯器沒有明顯的選項可用來防止這種行爲。

我想避免運行後編譯腳本來按字母順序重新排列生成的.java文件中的屬性,因爲這會分解屬性組,但我不確定是否有其他選項。

任何建議,非常感謝。

謝謝, 戴夫

回答

0

此主題爲我的問題提供了一個很好的解決方案。

Using XSL to sort attributes

答案之一包含一個XSL轉換,只是重新排列屬性。如果有點慢,完美的作品。

1

我建議使用XML解析器來驗證輸出的,而不是做文字比較。如果您打算解析xml以重新排序,那麼您最好使用XML工具進行比較。

編輯: 試圖通過操縱Java源代碼順序來控制生成的XML似乎是一種脆弱的做事方式。當然,這僅用於測試,所以如果出現問題,代碼仍然可以正常工作。人們總是會隨時更改源代碼的順序,有時是偶然的,如果您必須依賴某種順序,那麼它會是煩人的或者微妙的問題根源。

至於使用XML工具比較XML數據的方法,我從來沒有親自做過這個大規模的,但this link mentions a few free tools。對我來說,提供與XML相關的斷言的JUnit的擴展將是我的第一步,因爲這可以與我現有的測試很好地集成。否則,因爲您主要是在尋找確切的等價關係,所以您可以解析這兩個XML文件,然後迭代'expected'文件中的節點並查看這些節點是否存在於'actual'文件中。然後檢查你不希望看到的其他節點。

+0

的比較是一個大的bash腳本驅動的迴歸測試的一部分,我們目前沒有任何解析的XML響應。我可以使用XML diff工具,但我沒有任何經驗。我正在Solaris環境中工作 - 您是否可以建議一個可以從命令行調用的xml diff工具? 此外,要比較的文件可能無法根據模式進行驗證,因爲某些已知差異會被常量值替代。 – daveg 2009-11-30 19:18:15

+0

此外,我正在考慮重新排序.java文件中的屬性 - 而不是xml響應。我想編組使用反射,因爲.java文件中的順序似乎直接控制編組響應中的屬性順序。 – daveg 2009-11-30 19:20:00

+0

我編輯了我的答案來解決你的兩點。 – 2009-11-30 20:09:32

1

如果您需要執行XML文檔的文本比較,那麼有更好的方法可以比試圖控制不區分屬性排序的XML框架的輸出。

例如,有XMLUnit,這是一個專門用於XML斷言的junit擴展,它處理空白和排序非常好。

更通用的解決方案是XOM'sCanonicalizer,它輸出XML DOM,使得屬性排序和空白是可預測的。非常便利。

所以......讓JAXB(或其他)根據它認爲合適的方式生成XML,然後通過XMLUnit或XOM運行輸出並進行比較。這具有不依賴於JAXB的附加優勢,它可以處理任何生成的XML。

4

顯然,JAXB 2.0,你可以使用註釋@XmlAccessorOrder或@XmlType(propOrder =)