从XmlDocument中删除节点

下面的代码应该find合适的项目标签并将其从XmlDocument中删除,但是当我testing它时,它说:

要删除的节点不是此节点的子节点。

有谁知道这样做的正确方法?

public void DeleteProject (string projectName) { string ccConfigPath = ConfigurationManager.AppSettings["ConfigPath"]; XmlDocument configDoc = new XmlDocument(); configDoc.Load(ccConfigPath); XmlNodeList projectNodes = configDoc.GetElementsByTagName("project"); for (int i = 0; i < projectNodes.Count; i++) { if (projectNodes[i].Attributes["name"] != null) { if (projectName == projectNodes[i].Attributes["name"].InnerText) { configDoc.RemoveChild(projectNodes[i]); configDoc.Save(ccConfigPath); } } } } 

UPDATE

固定。 我做了两件事:

 XmlNode project = configDoc.SelectSingleNode("//project[@name='" + projectName + "']"); 

使用XPath查询代替For循环,这不是为了解决它,仅仅是因为这是一个更好的方法。

实际的修复是:

 project.ParentNode.RemoveChild(project); 

感谢帕特和查克对这个build议。

代替

 configDoc.RemoveChild(projectNodes[i]); 

尝试

 projectNodes[i].parentNode.RemoveChild(projectNodes[i]); 

尝试

 configDoc.DocumentElement.RemoveChild(projectNodes[i]); 

看起来你需要在调用RemoveChild之前selectprojectNodes [i]的父节点。

项目节点可能不是子节点,而是孙子或更低? GetElementsByTagName将为您提供来自子元素树IIRC中任何位置的元素。

当你用很长的一段时间(对于我来说很快)写得很烦的话,你可以使用下面提供的助手扩展方法。 耶新技术!

 public static class Extensions { ... public static XmlNode RemoveFromParent(this XmlNode node) { return (node == null) ? null : node.ParentNode.RemoveChild(node); } } ... //some_long_node_expression.parentNode.RemoveChild(some_long_node_expression); some_long_node_expression.RemoveFromParent(); 

看到你正在处理的XML文件的样本将是方便的,但我的猜测是你有这样的东西

 <Root> <Blah> <project>...</project> </Blah> </Root> 

该错误消息似乎是因为您正在尝试从祖父项而不是项目节点的直接父项中移除<project>