【问题标题】:How do I deep clone XMLDocument Object in Javascript?如何在 Javascript 中深度克隆 XMLDocument 对象?
【发布时间】:2017-11-22 12:30:54
【问题描述】:

我正在创建一个将 XML 文件解析为 XMLDocument 对象的工具。我正在使用 xml 解析器的浏览器实现,例如:

new DOMParser().parseFromString(text,"text/xml");

出于某种原因,我应该在另一个变量中拥有当前 XMLDocument 对象的副本。

问题是——如何对解析的xml对象进行深度克隆?

谢谢!

【问题讨论】:

    标签: javascript angularjs xml web


    【解决方案1】:

    您使用cloneNode(true)Document 继承自 Node

    var d2 = d.cloneNode(true);
    

    例子:

    var d = new DOMParser().parseFromString(
      "<root><x><y></y></x></root>",
      "text/xml"
    );
    // Prove it's a deep clone by removing `y` from `x`:
    console.log("d before", d.documentElement.firstChild.children.length);
    var x = d.documentElement.firstChild;
    var d2 = d.cloneNode(true);
    x.removeChild(x.firstChild);
    console.log("d after", d.documentElement.firstChild.children.length);
    console.log("d2 after", d2.documentElement.firstChild.children.length);

    Eugene Ryabtsev points out,这不会克隆来自prolog 的信息,这是一个很好的观点。

    在撰写本文时,序言信息包括:

    • XML 版本
    • standalone 标志
    • 编码

    其中只有standalone 标志是相关的。在撰写本文时,版本始终为 1.0(即使您在序言中提供不同的 1.x 值,它也会作为 XML 1.0 文档 per spec 处理);并且编码不相关,因为我们处理的是内存中的文档,而不是我们从字节反序列化的文本。

    cloneNode 确实没有复制独立标志(至少在 Chrome 上没有)。如果您还想复制独立标志,请添加:

    d2.xmlStandalone = d.xmlStandalone;
    

    cloneNode之后。

    【讨论】:

    • 不幸的是,这不会复制序言。
    • @EugeneRyabtsev - 这是一个很好的观点。我已经更新了解决这个问题的答案,但我的 XML 知识只是马马虎虎;更新看起来对吗?
    • 它对我不起作用,但我对克隆做了一些特定的事情 - 缩进并序列化它,所以对我来说,如果没有字符串序言就可以解决问题。 +1 用于分析。幸运的是,我的文件没有处理指令,所以我不必考虑这些。
    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 2015-01-08
    • 2019-08-09
    • 2012-06-05
    • 2013-09-06
    • 2010-10-15
    相关资源
    最近更新 更多