【问题标题】:JavaScript implementation of XML differencesJavaScript 实现 XML 的区别
【发布时间】:2009-06-13 12:13:28
【问题描述】:

是否有一些 javaScript 实现来处理 XML 数据之间的差异?

主要是检测差异的存在,改什么都没关系:attribute or node value.

要求如下:

  • 每个节点都有唯一的 ID(这是为查找更多候选库所做的简化之一)
  • 应检查节点、属性和节点值中的增量
  • 支持最多 3 个级别的 XML 节点层次结构
  • 计算结果也应该是 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>

【问题讨论】:

  • 虽然这在 JS 中是绝对可行的,但我怀疑它是否简单、高效或可靠。你能告诉我们为什么需要在 JS 而不是更明显的 XSLT 中这样做吗?
  • 也许 XSLT 在某些情况下会很有用,但它需要对我们进行服务器端更改,这是不合适的。我的用例是我们正在使用一些重量级的客户端组件,并且完全重新渲染此类组件很慢。此组件在更改时加载特定的 XML,但它应该只重新呈现更改的部分,而不是完全重新呈现。我正在考虑透明的 Http-proxy 组件某种“增量引擎”,但这是来自不同背景的问题。我将开始新的问题,如果在这里我没有运气。

标签: javascript xml browser xmldiff


【解决方案1】:

我不是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 控件,如果不需要跨浏览器兼容性,这些控件可能会提供您需要的功能。

【讨论】:

  • 如果 OP 对 XSLT 没问题,我会 +1,合并是 XSLT 的一个相当常见且可搜索的用例。
  • 是的。另一种方法是遍历 XMLFile1 中的每个节点和属性,然后运行 ​​XMLFile2.selectSingleNode() 传递节点或属性的 XPath 表达式以检查它是否存在,然后在节点值上使用 === 来查看它们是否不同,并将结果写入上述第三个 XML 文件。我只希望我有时间写它:-)
  • 对不起,跨浏览器兼容性是强要求。 XSLT 模板的服务器端开发脱离了上下文。
猜你喜欢
  • 2017-01-17
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2011-07-04
  • 2011-08-10
  • 2018-11-08
  • 2014-08-01
相关资源
最近更新 更多