Удаление узлов от XDocument

Это удаляет все элементы из документа:

        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?

Спасибо!

9
задан Jake 9 July 2010 в 18:24
поделиться

2 ответа

Видимо, когда вы итерируете по element.Elements(), вызов Remove() на одном из дочерних элементов приводит к yield break перечислителя. Итерация по element.Elements().ToList() устранила проблему.

19
ответ дан 4 December 2019 в 09:12
поделиться

Вот пример другого способа использования 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);
2
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: