Eliminar nodos de un XmlDocument

El siguiente código debería encontrar la etiqueta de proyecto apropiada y eliminarla del XmlDocument; sin embargo, cuando la pruebo, dice:

El nodo que se eliminará no es hijo de este nodo.

¿Alguien sabe la manera correcta de hacer esto?

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); } } } } 

ACTUALIZAR

Fijo. Hice dos cosas:

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

Reemplazó el bucle For con una consulta XPath, que no era para solucionarlo, simplemente porque era un mejor enfoque.

La solución actual fue:

 project.ParentNode.RemoveChild(project); 

Gracias Pat y Chuck por esta sugerencia.

En lugar de

 configDoc.RemoveChild(projectNodes[i]); 

tratar

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

tratar

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

Parece que debe seleccionar el nodo principal de projectNodes [i] antes de llamar a RemoveChild.

¿Es posible que los nodos del proyecto no sean secundarios, sino nietos o inferiores? GetElementsByTagName le dará elementos desde cualquier lugar en el árbol de elementos secundarios, IIRC.

Cuando se enoja lo suficiente escribiéndolo por el camino largo (para mí fue bastante pronto) puede usar un método de extensión auxiliar proporcionado a continuación. ¡Yay nueva tecnología!

 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(); 

Sería útil ver una muestra del archivo XML que está procesando, pero supongo que tendrá algo como esto

   ...   

El mensaje de error parece deberse a que está intentando eliminar del abuelo en lugar del padre directo del nodo del proyecto