函数 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 信息 | 完整代码示例 )