Вопрос

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

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

Это было полезно?

Решение

Вместо того, чтобы

configDoc.RemoveChild(projectNodes[i]);

попробуй

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

Другие советы

попробуй

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top