Сведения о вопросе

rjevskii

04:35, 1st August, 2020

Теги

c#   .net   xml   xmldocument    

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

Просмотров: 455   Ответов: 6

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

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

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

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

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

project.ParentNode.RemoveChild(project);

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



  Сведения об ответе

DO__IT

13:44, 12th August, 2020

Вместо

configDoc.RemoveChild(projectNodes[i]);

пробовать

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


  Сведения об ответе

dumai

12:14, 3rd August, 2020

пробовать

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


  Сведения об ответе

Chhiki

18:46, 23rd August, 2020

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


  Сведения об ответе

fo_I_K

07:47, 18th August, 2020

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


  Сведения об ответе

Chhiki

00:58, 27th August, 2020

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

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

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


  Сведения об ответе

VCe znayu

14:10, 17th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться