2009-01-09 100 views
11

我想我有一個相當獨特的問題需要解決。那麼,我無法使用Google找到足夠的信息。所以在這裏,XML Diff和合並

我在使用Oracle XML DB將XML文檔存儲爲XML的Java EE SOA應用程序。每當XML發生變化時,我都會增加版本並將以前的版本放入不同的表中。

現在的要求是,我應該將2個版本之間的差異存儲爲XML,而不是整個XML文檔。

  1. 是否有任何Java庫可以進行XML比較? (XMLUnit,...?)
  2. 是否有一個用於捕獲XML差異的標準XML模式?
  3. 我可以使用哪種轉換技術將「差異」應用於XML以便在版本之間來回切換? (XSLT,Groovy,....?)

我很感激你的時間。

+1

關於標準格式,你見過[RFC 5261](https://tools.ietf.org/html/rfc5261)? - 看起來它稍微早於你的問題 - 遲到比從未好。 – BrainSlugs83 2015-03-17 23:49:43

回答

4

有許多用Java編寫的開源XML diff工具,您可以從中挑選。這些工具的一個列表是​​。

9

在我上一份工作中,我們遇到了類似的問題:我們必須檢測兩個XML文件之間特定項目的更改,插入和刪除。這些文件不是任意的XML;他們必須堅持我們的XSD。

我們的解決方案是實現一種合併排序:解析文件(使用SAX解析器,而不是DOM解析器,以允許任意大的文件),並將解析的數據存儲在單獨的HashMaps中。然後,我們使用合併排序類型的算法比較兩個地圖的內容。

當然,文件越大,我們遇到的內存壓力越大,所以我最終編寫了一個FileHashMap類,將HashMap的值空間推送到隨機訪問文件。雖然理論上較慢,但此解決方案允許我們的比較使用非常大的文件,而不會出現抖動或OutOfMemoryError條件。 (該FileHashMap類的一個版本在此庫中可用:http://www.clapper.org/software/java/util/

我不知道我剛剛描述的內容是否遠遠接近您所需,但我想我會分享它,以防萬一。

好運。

8

備註:現在在RFC 5261中有一個XML感知「修補程序」的標準格式。至少有一個免費軟件程序,xmlpatch,它實現它。它是用C編寫的,你可以從Java中調用它。

+0

嗯,它看起來像你提供的鏈接是libxmlpatch這是一個C++庫。命令行工具(和Windows二進制文件)在哪裏? – BrainSlugs83 2015-03-18 00:00:05