Question

Le code suivant devrait trouver la balise de projet appropriée et la supprimer du XmlDocument. Cependant, lorsque je le teste, il indique :

Le nœud à supprimer n'est pas un enfant de ce nœud.

Est-ce que quelqu'un connaît la bonne façon de procéder ?

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

MISE À JOUR

Fixé.J'ai fait deux choses :

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

Remplacement de la boucle For par une requête XPath, ce qui n'était pas destiné à la corriger, simplement parce que c'était une meilleure approche.

Le correctif réel était :

project.ParentNode.RemoveChild(project);

Merci Pat et Chuck pour cette suggestion.

Était-ce utile?

La solution

Au lieu de

configDoc.RemoveChild(projectNodes[i]);

essayer

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

Autres conseils

essayer

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

On dirait que vous devez sélectionner le nœud parent de projectNodes[i] avant d'appeler RemoveChild.

Est-il possible que les nœuds du projet ne soient pas des nœuds enfants, mais des petits-enfants ou des nœuds inférieurs ?GetElementsByTagName vous donnera des éléments de n'importe où dans l'arborescence des éléments enfants, IIRC.

Lorsque vous êtes suffisamment ennuyé en l'écrivant sur le long terme (pour moi, c'était assez tôt), vous pouvez utiliser une méthode d'extension d'assistance fournie ci-dessous.Ouais, nouvelle technologie !

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

Il serait pratique de voir un échantillon du fichier XML que vous traitez, mais je suppose que vous avez quelque chose comme ceci

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

Le message d'erreur semble être dû au fait que vous essayez de supprimer <project> du grand-parent plutôt que du parent direct du nœud du projet

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top