📜  System.Private.Xml.dll 中出现“System.ArgumentException”类型的未处理异常:“要插入的节点来自不同的文档上下文 - C# (1)

📅  最后修改于: 2023-12-03 15:35:13.835000             🧑  作者: Mango

System.ArgumentException异常介绍

问题描述

当使用 C# 代码中的 System.Private.Xml.dll 进行 XML 操作时,可能会遇到以下异常:

System.ArgumentException: 要插入的节点来自不同的文档上下文

该异常通常发生在以下情况下:

  • 在将一个 XML 节点从一个文档复制到另一个文档时,尝试将该节点插入到另一个文档的文档上下文中。
  • 在将一个 XmlDocument 对象的子节点插入到一个不同的 XmlDocument 对象中时,尝试将该节点插入到目标文档的文档上下文中。
解决方案

为了避免此异常,您可以采取以下措施:

  1. 在将一个 XML 节点复制到另一个文档时,必须首先将该节点从源文档分离出来。然后,您可以在目标文档中插入该节点。如下所示:

    XmlNode myNode = sourceDocument.SelectSingleNode("//myNode");
    XmlNode importedNode = destinationDocument.ImportNode(myNode, true);
    destinationDocument.DocumentElement.AppendChild(importedNode);
    

    在此代码片段中,我首先选择了我的源文档中的一个节点。然后,我使用 ImportNode() 方法将该节点从源文档中分离出来,并将其添加到目标文档中。最后,我将目标文档中的节点附加到文档元素中。

  2. 如果您需要在多个 XmlDocument 对象之间移动节点,请使用 XDocumentXmlDocument 类型的对象。在这些类型的对象中,节点可以属于不同的文档上下文,因此您不必在移动节点之前将其分离出来。

  3. 如果您遇到此异常,也可以考虑重新设计您的 XML 数据。您可以尝试创建一个 XML 文档,使其包含所有必要的数据。然后,您可以在需要时将该文档作为整体复制到其他文档中。

结论

在 C# 中使用 System.Private.Xml.dll 进行 XML 操作时,如果要将节点从一个文档移到另一个文档中,请确保在插入节点之前将其分离出来,并始终检查该节点是否属于正确的文档上下文。此外,如果可能的话,使用 XDocument 或 XmlDocument 类型的对象进行操作,以便节点可以在它们之间移动而无需分离。