javascript - 如何在 Javascript 中深度克隆 XMLDocument 对象?

标签 javascript angularjs xml web

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

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

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

问题是 - 如何深度克隆解析的 xml 对象

谢谢!

最佳答案

您使用 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 标志是相关的。截至撰写本文时,版本始终为 1.0(即使您在序言中给出了不同的 1.x 值,它也会被处理为 XML 1.0 文档 per spec );并且编码不相关,因为我们正在处理内存中的文档,而不是我们从字节反序列化的文本。

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

d2.xmlStandalone = d.xmlStandalone;

cloneNode之后。

关于javascript - 如何在 Javascript 中深度克隆 XMLDocument 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434798/

相关文章:

javascript - 无法从 TIdHTTPCommandGet 过程 OnCommandGet 访问 .js 文件

javascript - 仅在代码的一个函数内修改 XmlHttpRequest

javascript - 在新选项卡 'about:blank' 上打印并像数据表库一样打印后关闭

javascript - 带有断线的 JSON 到 HTML, Angular 转换

c# - XML 中的非法字符

xml - 在 XSLT 中检查字符串是否为有效日期

javascript - 如何在 jquery/javascript 中的黑白表单标签中选择带有名称的隐藏输入标签

mysql - API 服务器返回 404 错误

AngularJS $transinclude 未定义

java - 如何使用dom解析器java解析xml中的相同名称标签?