2012-02-10 65 views
1

我有一個XML序列化類的複雜圖表,我可以(de)序列化到硬盤就好了。但是我如何處理巨大的變化到圖模式結構?是否有一些機制來處理XML模式升級?有些類允許我將舊數據遷移到新格式?XML(de)序列化和模式升級

當然我可以使用XmlReader/XmlWriter,遍歷每個節點和屬性並編寫幾千行代碼將數據轉換爲新格式,但也許有更好的方法?


我發現Object graph serialization in .NET and code version upgrades,但我不認爲當有模式的重大變化所鏈接的條款適用。

回答

2

您可以使用XSLT,而不用編寫幾千行代碼來使用XmlReader/XmlWriter轉換文件。我們仍在談論數百行代碼,並且執行速度可能更慢,但如果您擅長XSLT,則可以更快地完成它。

另一種方法是構建一個連接舊類和新類的C#程序(當然,您需要重命名舊類以避免命名衝突)。該程序將從磁盤加載OldMyClass,從其屬性值構造NewMyClass,並將NewMyClass序列化到磁盤。從本質上講,這種方法將轉換任務轉移到C#領域,這可能會讓您更加熟悉。

+0

+1謝謝,XSLT看起來很有希望。但根據http://stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-net看來XSLT 2.0尚未在.NET中實現。由於XSLT 1.0已經快13年了,我想知道它是否足夠強大,可以處理複雜的變化。 – Paya 2012-02-10 14:55:00

+0

@Paja由於這是一次性交易,您不需要.NET實現:使用任何可以從命令行運行的XSLT引擎。爲引擎提供你的「腳本」和你的數據,並保存它產生的輸出。我使用了[Saxon](http://www.perfectxml.com/SoftDetails.asp?id=193),但它在11年前就已經很長了;自那時起,更新的引擎就被編寫出來了,你可能想在選擇一個任務之前做一些研究。無可否認,編寫XSLT的學習曲線相對較爲陡峭,但一旦您完成了初步的工作,您將能夠非常快速地編寫大量複雜的轉換。 – dasblinkenlight 2012-02-10 15:03:23

+0

我正在爲最終用戶編寫一個程序,因此需要隨遷移算法一起分發。正因爲如此,直接在.NET框架中的實現將非常棒,因爲我不喜歡使用額外的大型庫來擴展我的設置。 – Paya 2012-02-10 15:10:54

0

在這種情況下,我把我的變化,我的對象,並通過XmlSerializer的重建我的XML:http://support.microsoft.com/kb/815813

有了這個,我加載和保存基於我的目標新的XML模式。