Удаление узлов из XmlDocument

Следующий код должен найти соответствующий тег проекта и удалить его из XmlDocument, однако, когда я тестирую его, он говорит:

Удаляемый узел не является дочерним по отношению к этому узлу.

Кто-нибудь знает правильный способ сделать это?

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

ОБНОВИТЬ

Исправлена. Я сделал две вещи:

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

Заменили цикл For запросом XPath, который не был исправлен, просто потому, что это был лучший подход.

Фактическое исправление было:

project.ParentNode.RemoveChild(project);

Спасибо Пэт и Чаку за это предложение.

6 ответов

Решение

Вместо

configDoc.RemoveChild(projectNodes[i]);

пытаться

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

Пытаться

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

Похоже, вам нужно выбрать родительский узел projectNodes[i] перед вызовом RemoveChild.

Когда вы достаточно раздражаетесь, если пишете это долго (для меня это было довольно скоро), вы можете использовать вспомогательный метод расширения, представленный ниже. Yay новая технология!

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

Возможно ли, что узлы проекта - это не дочерние узлы, а внуки или ниже? GetElementsByTagName предоставит вам элементы из любого места в дереве дочерних элементов, IIRC.

Было бы удобно увидеть образец файла XML, который вы обрабатываете, но я думаю, что у вас есть что-то вроде этого

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

Кажется, сообщение об ошибке, потому что вы пытаетесь удалить <project> от деда, а не от прямого родителя узла проекта

Другие вопросы по тегам