【问题标题】:How to get an independent copy of an XDocument?如何获得 XDocument 的独立副本?
【发布时间】:2013-04-03 08:57:03
【问题描述】:

我正在尝试创建一个新的 XDocument,如下所示:

var xmlString = _documentDictionary[documentKey].ToString(SaveOptions.DisableFormatting);

XDocument xml = XDocument.Parse(xmlString);

我现在有xml,虽然我本来应该是一个独立的文档实例,因为我从原始文档中提取了字符串并从中创建了一个新的。

但是当我修改xml然后检查_documentDictionary[documentKey]时,我可以看到原始文档也被修改了。

如何从我拥有的现有集合中获取新的独立文档?

注意:

这些我都试过了,还是不行:

var xmlString = _documentDictionary[documentKey].ToString(SaveOptions.DisableFormatting);
var copyDoc = new XDocument(xmlString);

var copyDoc = new XDocument(_documentDictionary[documentKey]);

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    有一个copy constructor defined for XDocument class

    var newDoc = new XDocument(xml);
    

    您使用此构造函数制作 XDocument 的深层副本。

    这个构造函数遍历文档中的所有节点和属性 在另一个参数中指定,并将所有节点的副本创建为 它组装新初始化的 XDocument。

    快速测试

    var doc = new XDocument(new XElement("Test"));
    var doc2 = new XDocument(doc);
    
    doc.Root.Name = "Test2";
    
    string name = doc.Root.Name.ToString();
    string name2 = doc2.Root.Name.ToString();
    

    name"Test2"name2"Test",有什么证据表明对 doc 所做的更改不会影响 doc2

    【讨论】:

    • 我试过了,但它似乎不起作用。我再试一次。
    • 发生了一些奇怪的事情。我刚刚尝试了您的测试并且它有效,但是当我在自己的对象上尝试它时它失败了。我创建了新文档并对其进行了修改,按照您的描述更改了根名称,我可以看到它正在原始文档中进行更新。
    • 所以你应该检查一下你是否在适当的时候创建一个副本。
    • 您必须在对源文档进行任何更改之前制作副本。
    • 现在可以使用了。我对其进行了更改,以便在需要它之前的最后一个命令之前不创建新文档,并且问题不再存在。谢谢。
    【解决方案2】:

    尝试复制构造函数,比如;

    var newDoc = new XDocument(xml);
    

    来自MSDN

    您可以使用此构造函数来制作 XDocument 的深层副本

    这个构造函数遍历文档中的所有节点和属性 在另一个参数中指定,并将所有节点的副本创建为 它组装新初始化的 XDocument。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多