繁体   English   中英

具有关联的XElement的XDocument / Element的深层复制

[英]Deep Copy of XDocument/Element with associated XElement (s)

好的,我有一个XDocument

BaseDocument = XDocument.Load(@".\Example\Template.xml");

以及通过方法生成的XElement的一些DataStructure(在XDocument内部)。 这只是一个例子:

Dictionary<string, List<XElement>> ElementMap = GetElementMapping(BaseDocument);

我想同时复制两者,

有没有比这更有效的方法,

XDocument copy = new XDocument(BaseDocument);
Dictionary<string, List<XElement>> copyElementMap = GetElementMapping(copy);

复制数据结构,以便内部的XElements引用新副本?

我做了一些图片来展示我想要的东西:

当前解决方案: 复制与再生

智能解决方案: 全部复制

就您制作的XDocument副本而言,我们可以肯定的是, 正如我们从第2320行的文档中可以看到的那样 ,它肯定会尽可能地快。 这确实复制了我们想要的方式。

如果您需要对XDocument对象进行深层复制,那么以上是关于性能的最佳方法。 它无需重新加载文件即可对文档中的每个节点(包括XElement,XAttributes,注释等)执行深层复制。 它在内存中读取并克隆所有节点。 这是一种高效的操作,也是我们所能获得的最高效的操作,因为它会自动禁止通常在XDocument内部触发的所有通知事件。 可以从以下方式验证深层副本:

使用的XML:

<?xml version="1.0" encoding="utf-8" ?>
<FirstNode>
  <ChildNode attributeOne="1"/>
</FirstNode>

源代码

XDocument xDoc = XDocument.Load("AnXml.xml");
XDocument copy = new XDocument(xDoc);

Console.WriteLine("xDoc before change copy: {0}", xDoc.ToString());

copy.Root.Add(new XElement("NewElement", 5));
copy.Element("FirstNode").Element("ChildNode").Attribute("attributeOne").SetValue(2);
Console.WriteLine("xDoc after change copy: {0}", xDoc.ToString());
Console.WriteLine("copy after change copy: {0}", copy.ToString());

Console.ReadKey();

对Console.WriteLine的两次调用输出不同的值,指示两个引用指向具有不同结构的不同项,从而证明已进行了深拷贝。

请注意,如果要重复使用现有的XElement,则无法在不使用反射的情况下将它们设置到XDocument中:在XDocument中设置XElement的所有公共方法都将执行深层复制。 从我包含的链接(.Net源代码)可以明显看出这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM