2010-01-06 122 views
58

我經常需要爲不同的基於XML的導入例程設計XML模式。很顯然,XML模式會隨着時間的推移而發展,或者它們可能包含修復的錯誤,所以捕獲模式的版本以及使用一些機制來綁定特定版本非常重要。什麼是版本控制XML模式的最佳實踐?

目前我有兩個方案:

  1. 該錯誤是架構和所有模式實例中發現必須遵守固定的版本。

  2. 該模式已升級,應該被認爲是可取的,但也應該支持舊模式。

最後我想出了存儲架構的命名空間中的版本信息:

targetNamespace="http://schemas.company.com/Geodesy/2010/River.xsd" 

當固定我解決它在同一個命名空間,但一個錯誤,如果我將要升級的模式,然後我需要創建一個新的命名空間,但與升級月新增:

targetNamespace="http://schemas.company.com/Geodesy/2010/01/River.xsd" 

如果我在一個月內有一個以上的升級,然後就在一天追加太:

targetNamespace="http://schemas.company.com/Geodesy/2010/01/17/River.xsd" 

你知道更好的方法嗎?

回答

79

這是一個非常棘手的問題,它甚至都不好笑,我花了數年的時間爲其提供諮詢支持。

有很多best practices那裏,但其中大多數不適用於所有情況。例如,許多人提倡使用「xsd:any」來允許擴展,如果開發人員負責維護模式,將其轉化爲轉儲,這只是一種災難。

這裏有你一些提示,如果你入門:

  • 放一個小版本號,微版本號,日期,或其他任何東西的那種,到您的命名空間。每次更改名稱空間時,都會中斷所有處理應用程序。
  • 在XML實例文檔中放入一個「版本」屬性。這將使處理應用程序或版本適配器服務能夠找出它正在處理的內容。
  • 確定是否構成向後兼容變更的策略,例如:添加可選元素不會中斷髮件人,也不會在接收者忽略他們不知道的元素(JAXB和XMLBeans可以這樣配置)

不幸運!

+1

Sooo,或許我們應該在評論中提供關於版本的信息? – 2015-04-17 19:14:50

+0

有沒有辦法在使用JAXB進行反編組之後獲取根目錄中的版本號? – CMPE 2017-08-04 13:50:23