Frage

Der folgende Code sollte das entsprechende Projekt-Tag finden und aus dem XmlDocument entfernen. Wenn ich es jedoch teste, heißt es:

Der zu entfernende Knoten ist kein untergeordneter Knoten dieses Knotens.

Weiß jemand, wie man das richtig macht?

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

AKTUALISIEREN

Fest.Ich habe zwei Dinge getan:

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

Die For-Schleife wurde durch eine XPath-Abfrage ersetzt, die nicht zur Behebung des Problems diente, sondern nur, weil es ein besserer Ansatz war.

Die eigentliche Lösung war:

project.ParentNode.RemoveChild(project);

Vielen Dank an Pat und Chuck für diesen Vorschlag.

War es hilfreich?

Lösung

Anstatt

configDoc.RemoveChild(projectNodes[i]);

versuchen

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

Andere Tipps

versuchen

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

Sieht so aus, als müssten Sie den übergeordneten Knoten von projectNodes[i] auswählen, bevor Sie RemoveChild aufrufen.

Ist es möglich, dass die Projektknoten keine untergeordneten Knoten, sondern Enkel oder niedrigere Knoten sind?GetElementsByTagName liefert Ihnen Elemente von überall im untergeordneten Elementbaum IIRC.

Wenn es Sie ausreichend nervt, den langen Weg zu schreiben (für mich war das ziemlich schnell), können Sie eine der unten bereitgestellten Hilfserweiterungsmethoden verwenden.Juhu, neue 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();

Es wäre praktisch, ein Beispiel der XML-Datei zu sehen, die Sie verarbeiten, aber ich vermute, dass Sie so etwas haben

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

Die Fehlermeldung scheint darauf zurückzuführen zu sein, dass Sie versuchen, es zu entfernen <project> vom Großelternteil und nicht vom direkten Elternteil des Projektknotens

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top