2008-08-21 10 views
39

El siguiente código debe encontrar la etiqueta de proyecto adecuado y eliminarlo de la XmlDocument, sin embargo, cuando lo prueba, que dice:Eliminación de nodos de un XmlDocument

El nodo que ser eliminado no es un hijo de este nodo .

¿Alguien sabe la manera correcta de hacerlo?

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

ACTUALIZACIÓN

fijo. Hice dos cosas:

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

Se reemplazaron el bucle con una consulta XPath, que no era para su fijación, sólo porque era un mejor enfoque.

La solución real fue:

project.ParentNode.RemoveChild(project); 

Gracias Pat y Chuck para esta sugerencia.

+0

Estaba buscando exactamente esto. Pasé medio día buscando cosas xml en Internet y medio minuto en SO. Otra razón más por la que Jeff y Joel estaban en camino. –

Respuesta

53

En lugar de

configDoc.RemoveChild(projectNodes[i]); 

tratar

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

¿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.

0

Sería muy útil para ver una muestra del archivo XML que está procesando, pero mi conjetura sería que usted tiene algo parecido a este mensaje

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

El error parece ser debido a que estamos tratando de eliminar <project> del abuelo en lugar de la matriz directa del nodo del proyecto

2

tratar

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

Parece que es necesario seleccionar el nodo padre de projectNodes [i] antes de llamar removeChild.

0

Cuando se enoja lo suficiente escribiéndolo por un largo camino (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(); 
Cuestiones relacionadas