函数 RemoveChild(XmlNode 节点)在 C# 中失败

Posted

技术标签:

【中文标题】函数 RemoveChild(XmlNode 节点)在 C# 中失败【英文标题】:Function RemoveChild(XmlNode node) failed in C# 【发布时间】:2010-07-06 09:06:03 【问题描述】:

当我尝试使用 RemoveChild() 删除我的一些子元素时。但是抛出异常。 我在下面附上了我的代码。

    nodeName = doc.SelectSingleNode("//Equipment//DataCollections//EnabledIDs//MyID[@id='" + attrValue + "']"); 
   // Found the nodeName successfully druing run time.
    doc.DocumentElement.RemoveChild(nodeName); 
   // faild to Remove the node

在下面显示错误:

An unhandled exception of type 'System.ArgumentException' occurred in System.Xml.dll

Additional information: The node to be removed is not a child of this node. 

如何删除节点?

[更新]

使用 VS2005 和 .NET 2.0。

【问题讨论】:

似乎子节点在被选中时与其创建它的父实例“无关”。这对我来说似乎是一个错误。解决方法是(正如其他人所说):childNode.ParentNode.RemoveChild(childNode) 【参考方案1】:

我相信 .RemoveChild 正在删除您选择的节点的子节点。

nodeName 下有没有孩子或者已经是叶子了?

编辑:

其实你需要把Parent的Child去掉,试试下面的方法:

nodeName.parentNode.removeChild(nodeName)

【讨论】:

【参考方案2】:

您试图直接从文档元素中删除一个节点,而它实际上是文档元素的曾孙(或者可能只是孙子)。 RemoveChild 仅在您指定 direct 子代时有效,而不仅仅是任何后代。

试试这个:

nodeName.ParentNode.RemoveChild(nodeName);

(如果按照 Adkins 的回答存在 Remove(),那会更好 - 但我在 MSDN 中找不到这样的方法。)

【讨论】:

如果您使用的是 Linq to XML,它确实存在。我对我的答案进行了扩展以涵盖它。 我读了另一本名为“Pro .NET 2.0 XML”的书。我按照示例代码表格编写了我的原始代码。但是示例 xml 文件并不像我的那样复杂。正如乔恩的回答。我的元素应该是文档元素的曾孙。 +1,谢谢。 @Adkins。我添加了类似if (node != null) // do ... 的保护【参考方案3】:

您应该从直接父级中删除子级,而不是从顶部删除:

nodeName.ParentNode.RemoveChild(nodeName); 

【讨论】:

【参考方案4】:

而不是使用 .RemoveChild 尝试只使用 .Remove 这应该会给你你正在寻找的结果。

编辑::

请注意,这仅在您使用 Linq to XML 时有效。然后,您将使用 XNode 的一些变体,并且可以简单地说 blah.Remove,它应该可以解决问题。如果您不使用 Linq to XML,我建议您研究一下,因为它太棒了。

【讨论】:

没有基于我的 VS2005 & .NET 2.0 的 Remove() 方法。 :-) @Nano:Linq 首先是 .NET 3.5(?),所以这可能是我的答案对你不起作用的原因。您是否有某些限制您使用 2.0 的要求?如果不是,则值得考虑升级。

以上是关于函数 RemoveChild(XmlNode 节点)在 C# 中失败的主要内容,如果未能解决你的问题,请参考以下文章

Groovy自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )

删除节点removeChild()

删除节点(removeChild())

(转载)Javascript removeChild()不能删除全部子节点的解决办法

xmlnode如何查看节点是不是存在

通过当前节点的 xmlnode 属性之一获取值