2009-06-13 76 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控件,这些控件可能会提供您需要的功能。