2009-06-13 73 views
1

是否有一些javaScript實現來處理XML數據之間的增量?主要觀點是檢測差異的存在,無論改變什麼:屬性或節點值。XML差異的JavaScript實現

要求如下:

  • 每個節點都會有唯一的ID(這是爲尋求更多的候選人函數庫的簡化之一)
  • 增量應該在節點進行檢查,屬性和節點值
  • 支持XML節點層次可達3個水平
  • 計算的結果應該是也XML(參見實施例),但它可能是增加,更新和刪除的節點的3個數組
  • 忽略增量計算中的某些子節點,例如我想跟蹤3級層次結構,而不是更多
  • 更改檢測不應傳播到上層節點,因此,例如子節點更改不應使父節點更新

下面是例子,應該如何工作:
XML#1:

<node id="0"> 
    <node id="1"> 
    <node id="4"> 
     <node id="23">DATA</data> 
    </node> 
    <node id="5">DATA</node> 
    </node> 
</node> 

XML#2:

<node id="0"> 
    <node id="1"> 
    <node id="3"> 
     <node id="342">DATA</data> 
    </node> 
    <node id="5" some_attribute="attr"/> 
    </node> 
    <node id="6"/> 
</node > 

所以結果應該是以下幾點:

<result> 
    <added> 
     <id>6</id> 
     <id>3</id> 
     <id>342</id> 
    </added> 
    <updated> 
     <id>5</id> 
    </updated> 
    <removed> 
     <id>4</id> 
     <id>23</id> 
    </removed> 
</result> 
+0

儘管這在JS中將是嚴格可行的,但我懷疑它會簡單,高效或可靠。你能告訴我們爲什麼你需要在JS中做這件事,而不是更明顯的XSLT? – annakata 2009-06-16 16:08:11

+0

也許XSLT在某些情況下會很有用,但它需要我們改變服務器端,這是不合適的。我的用例是我們正在使用一些重量級的客戶端組件,並且對此組件進行完全重新渲染的速度很慢。該組件在更改時加載了特定的XML,但它應該僅重新渲染更改的部分,而不是完全渲染。我正在考慮透明的Http-proxy組件,它是某種「delta引擎」,但這是來自不同環境的問題。我會開始提出新的問題,如果在這裏我沒有運氣。 – 2009-06-17 16:22:02

回答

0

我不是XSLT的一個大用戶,但我敢肯定,你可以用它來實現你想,如果你已經熟悉了該怎麼辦它。也許你應該嘗試在問題中添加標籤。

下面的XSLT文件,從http://msdn.microsoft.com/en-us/magazine/cc164169.aspx拍攝,據稱將合併兩個文件,但我懷疑這會是你希望它是全面的:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <Container> 
     <xsl:copy-of select="document('product.xml')"/> 
     <xsl:copy-of select="document('material.xml')"/>   
    </Container> 
    </xsl:template> 
</xsl:stylesheet> 

頁面上的例子是.NET,但如果不需要跨瀏覽器兼容性,則Internet Explorer可以訪問許多MSXML ActiveX控件,這些控件可能會提供您需要的功能。