Это удаляет все элементы из документа:
XDocument document = XDocument.Load(inputFile);
foreach (XElement element in document.Elements())
{
element.Remove();
}
document.Save(outputFile);
Это не имеет никакого эффекта:
XDocument document = XDocument.Load(inputFile);
foreach (XElement element in document.Elements())
{
//element.Remove();
foreach (XElement child in element.Elements())
child.Remove();
}
document.Save(outputFile);
Я пропускаю что-то здесь? Так как это все ссылки на элементы в XDocument, разве изменения не должны вступать в силу? Есть ли некоторый другой способ, которым я должен удалять вложенных детей из XDocument?
Спасибо!
Видимо, когда вы итерируете по element.Elements()
, вызов Remove()
на одном из дочерних элементов приводит к yield break
перечислителя. Итерация по element.Elements().ToList()
устранила проблему.
Вот пример другого способа использования System.Xml.XPath (измените запрос xpath в соответствии с вашими потребностями):
const string xml =
@"<xml>
<country>
<states>
<state>arkansas</state>
<state>california</state>
<state>virginia</state>
</states>
</country>
</xml>";
XDocument doc = XDocument.Parse(xml);
doc.XPathSelectElements("//xml/country/states/state[.='arkansas']").ToList()
.ForEach(el => el.Remove());;
Console.WriteLine(doc.ToString());
Console.ReadKey(true);