angularjs 如何在JavaScript中深度克隆XMLDocument对象?

hzbexzde  于 12个月前  发布在  Angular
关注(0)|答案(2)|浏览(109)

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

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

出于某种原因,我应该在另一个变量中拥有当前XMLDocument对象的副本。
问题是-如何对解析的xml对象进行深度克隆?
谢谢你,谢谢

8tntrjer

8tntrjer1#

使用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);

尤金Ryabtsev指出,这不会从序言中克隆信息,这是一个很好的观点。
在撰写本文时,prolog信息包括:

  • XML版本
  • standalone标志
  • 编码

其中,只有standalone标志是相关的。在撰写本文时,版本始终是1.0(即使在序言中给予不同的1.x值,它也会按照规范作为XML 1.0文档处理);编码也不相关,因为我们处理的是内存中的文档,而不是我们从字节反序列化的文本。
但是独立标志确实没有被cloneNode复制(至少在Chrome上没有)。如果还想复制独立标志,请添加:

d2.xmlStandalone = d.xmlStandalone;

cloneNode之后。

oxf4rvwz

oxf4rvwz2#

比你想象的要容易。只需使用Serializer和DOMParser。

cloneXML=function(xml) {
    var str = (new XMLSerializer()).serializeToString(xml.getRootNode())
    return new window.DOMParser().parseFromString(str, "text/xml")
};

相关问题