2013-01-10 21 views
2

如何在Java中處理不斷髮展的XML模式?我有一個用例,我必須在Java應用程序中支持一組舊的和不斷髮展的XML模式(即支持Foo v1,v2,v3,v4,v5)。如何在Java中處理不斷髮展的XML模式

我的使用案例包括 - 讀寫針對不同版本的foo XML模式 的所有富XML內容 - 合併富XML的內容,可以在不同的編寫針對使用不同的版本OVAL XML模式(即合併富V1與Foo v5)。

foo的XML架構是相當複雜的,有一種已知的向後兼容性問題,因此有可能是富V1 XML的內容可以使用美孚v3的XML模式失敗的XML模式驗證。

我想到了2種方法 1)使用Java XML數據綁定(如JAXB)併爲每個XML模式版本生成一組綁定。以Foo XML模式爲例,我將爲Foo XML模式v1至v5生成5組綁定。面臨的挑戰是如何從Foo XML內容的版本與其他版本的XML內容進行合併。

2)創建一組Java數據模型,並使用SAX,DOM,JDOM手動分析它,並試圖解決所有的向後兼容性問題,我可能會。現在的挑戰是我必須在沒有JAXB的幫助下自己解析XML。

我想獲得的是什麼來處理不斷髮展的XML架構的最佳方法一些建議。 Java XML數據綁定到正確的路徑還是創建我自己的Java數據模型並手動解析它?

+0

我不知道'XSLT'能在這裏工作嗎?如果不是這樣,我可能會採用多種綁定方式,然後使用自己編寫的一套額外常用集合來組合您的方法。每次要使用xml數據時都要經過通用設置。 – atomman

+0

順便說一句Java是一個詞,而不是縮寫 –

回答

3

根據我的經驗,最重要的是數據模型而不是輸入格式。如果你能夠提供一個乾淨的模型並且抽象出不同輸入的所有缺點,你將會得到一個更乾淨,更易於管理的代碼行。

鑑於單個文檔的版本往往是增量式的,如果您自己編寫解析器,您可能會獲得大量的代碼重用,或者您可以創建並行JAXB包來處理與另一個類配對的每種格式將該特定於版本的模型轉換爲您的頂級模型。

+0

感謝您的反饋。特別是建議您創建頂級模型的部分,然後使用JAXB爲每個版本的模式生成綁定,然後創建一個轉換器將JAXB模型數據轉換爲頂級數據模型。我會考慮到這一點。再次感謝。 – beyonddc

1

我們爲每個新版本都安裝了Java轉換器。他們能夠從相應的以前的版本轉換。我們將v1作爲XML,使用JAXB將其轉換爲Java,然後轉換爲數據模型v2,v3,v4,v5。轉換器都在版本控制下,成爲每個發佈的工件的一部分。

此外,我們支持像V2-1,V2-2分支機構。這要求我們有從分支n到下一個主要n + 1的轉換器(例如v2-2→v3)。在一定的時間間隔,我們停止支持「非常老」的分支機構。

+0

感謝您的反饋。 – beyonddc

1

模式進化是數據綁定方法的大缺點。如果您的模式不穩定,那麼數據綁定將是一件麻煩事,正如您發現的那樣。這裏有一個基本的衝突:XML被設計爲在它處理的數據結構中是靈活的(「半結構化」),而Java不是。你確定數據綁定對你來說是正確的嗎?使用爲XML設計的編程語言(如XSLT或XQuery)可能會更好嗎?

+0

我很樂意提出建議,但我的一個要求是我需要能夠修改XML的內容,因此我需要將整個XML內容加載到某種模型中,以便我可以在XML中插入元素或屬性。 我只能想到創建自己的數據模型,然後手動解析XML或使用數據綁定方法。 – beyonddc

+0

我認爲您應該使用XSLT或XQuery - 可能使用XQuery更新。 –