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

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

44 голосов
/ 21 августа 2008

Следующий код должен найти соответствующий тег проекта и удалить его из 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);
            }
        }
    }
}

UPDATE

Fixed. Я сделал две вещи:

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

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

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

project.ParentNode.RemoveChild(project);

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

Ответы [ 6 ]

63 голосов
/ 21 августа 2008

вместо

configDoc.RemoveChild(projectNodes[i]);

попробуй

projectNodes[i].parentNode.RemoveChild(projectNodes[i]);
2 голосов
/ 21 августа 2008

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

2 голосов
/ 21 августа 2008

попробуй

configDoc.DocumentElement.RemoveChild(projectNodes[i]);
1 голос
/ 21 августа 2008

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

0 голосов
/ 20 июня 2012

Когда вы достаточно раздражаетесь, если пишете это долго (для меня это было довольно скоро), вы можете использовать вспомогательный метод расширения, представленный ниже. 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();
0 голосов
/ 21 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...