Ответ 1
Вместо
configDoc.RemoveChild(projectNodes[i]);
попробуйте
projectNodes[i].parentNode.RemoveChild(projectNodes[i]);
Следующий код должен найти соответствующий тег проекта и удалить его из XmlDocument, однако, когда я его тестирую, он говорит:
Удаляемый node не является дочерним элементом этого node.
Кто-нибудь знает правильный способ сделать это?
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);
Спасибо Пэт и Чак за это предложение.
Вместо
configDoc.RemoveChild(projectNodes[i]);
попробуйте
projectNodes[i].parentNode.RemoveChild(projectNodes[i]);
попробуйте
configDoc.DocumentElement.RemoveChild(projectNodes[i]);
Похоже, вам нужно выбрать родительский node projectNodes [i] перед вызовом RemoveChild.
Возможно ли, что узлы проекта не являются дочерними узлами, но внуками или ниже? GetElementsByTagName даст вам элементы из любого места в дереве дочерних элементов, IIRC.
Было бы удобно увидеть образец XML файла, который вы обрабатываете, но я предполагаю, что у вас есть что-то вроде этого
<Root>
<Blah>
<project>...</project>
</Blah>
</Root>
Сообщение об ошибке похоже на то, что вы пытаетесь удалить <project>
из дедушки и бабушки, а не напрямую родитель проекта node
Когда вы достаточно раздражаетесь, написав его длинным путем (для меня это было довольно скоро), вы можете использовать вспомогательный метод расширения, приведенный ниже. 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();