C# XmlNode RemoveAll()使由其他变量持有的节点的引用为空
我正在尝试从根目录中除去需要存在的子节点之外的所有子节点,下面是我写的C# XmlNode RemoveAll()使由其他变量持有的节点的引用为空,c#,.net,C#,.net,我正在尝试从根目录中除去需要存在的子节点之外的所有子节点,下面是我写的 XmlNode root = XmlTemplate.DocumentElement; string targetPrefix = root.Prefix; var xmlNamespaceManager = new XmlNamespaceManager(XmlTemplate.NameTable);
XmlNode root = XmlTemplate.DocumentElement;
string targetPrefix = root.Prefix;
var xmlNamespaceManager = new XmlNamespaceManager(XmlTemplate.NameTable);
xmlNamespaceManager.AddNamespace(root.Prefix, root.NamespaceURI);
XmlNodeList nodeList = null;
if (!String.IsNullOrEmpty(targetPrefix))
{
nodeList = root.SelectNodes("descendant::" + targetPrefix + ":fields", xmlNamespaceManager);
}
else
{
nodeList = root.SelectNodes("descendant::fields");
}
正如预期的那样,我能够在nodeList中获得所需的节点。我可以在调试模式下运行该节点。当下面的代码语句运行时,就会出现混乱
root.RemoveAll();
root.AppendChild(nodeList[0]);
据我所知,子节点仍在nodeList中引用,因此对象不会被垃圾收集,但在root.RemoveAll()执行nodeList后,该对象将变为空
root.innexText=”“代码>也做同样的事情
XML方法有什么不同吗?我误解了哪个概念…上面说:
此方法返回的XmlNodeList对象将有效,而基础文档保持不变。如果基础文档发生更改,可能会返回意外结果(不会引发异常)
因此,结果似乎在某种程度上与底层Xml文档相耦合。调用更改文档后,XmlNodeList
的任何特定行为都不会得到保证
因此,在您的情况下,在从文档中删除节点之前,复制节点列表的内容应该是最安全的:
var nodes = nodeList.Cast<XmlNode>().ToArray();
var nodes=nodeList.Cast().ToArray();
这使用来自的一些扩展方法将XmlNodeList
的内容复制到一个新数组中(该数组独立于Xml文档)