Pregunta

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

El nodo que se va a eliminar no es hijo de este nodo.

¿Alguien sabe la forma 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

Fijado.Hice dos cosas:

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

Se reemplazó el bucle For con una consulta XPath, que no era para solucionarlo, solo porque era un mejor enfoque.

La solución real fue:

project.ParentNode.RemoveChild(project);

Gracias Pat y Chuck por esta sugerencia.

¿Fue útil?

Solución

En lugar de

configDoc.RemoveChild(projectNodes[i]);

intentar

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

Otros consejos

intentar

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

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

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

Cuando te molestes lo suficiente al escribirlo de forma larga (para mí, eso fue bastante pronto), puedes usar un método de extensión auxiliar que se proporciona a continuación.¡Sí, 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ás procesando, pero supongo que tienes algo como esto.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top