Как удалить узел в xml документе?
В этой небольшой заметке хочу показать Вам, как удалить узел в xml документе с помощью технологии Linq to XML.
И так, для начала создадим и добавим в проект xml файл, который имеет следующую структуру:
<?xml version="1.0" encoding="utf-8" ?> <friends> <friend id="1"> <name>Иван</name> <lastname>Иванов</lastname> <age>22</age> </friend> <friend id="2"> <name>Петр</name> <lastname>Петров</lastname> <age>23</age> <brothers> <name>Vasya</name> <age>26</age> </brothers> </friend> <friend id="3"> <name>Сергей</name> <lastname>Сергеев</lastname> <age>24</age> </friend> </friends>
Затем добавим строку, которая позволяет при работе с Linq to XML напрямую обращаться к типам, не указывая полных имен.
using System.Xml.Linq;

Удаление xml узла
В качестве первого примера рассмотрим, как удалить последний узел в xml документе.
try
{
XDocument xDoc = XDocument.Load(pathToXmlFile);
xDoc.Root.Nodes().ElementAt(2).Remove();
}
catch (Exeption ex)
{
MessageBox.Show(ex.Message);
} Сначала с помощью метода Load загружаем xml файл и строим DOM дерево. Затем, с помощью метода Nodes, получаем коллекцию всех xml узлов, кроме корневого узла, которые содержаться в данном xml документе. После чего, используя метод расширения ElementAt, получаем доступ к элементам, полученной ранее коллекции. И с помощью метода Remove удаляем указанный xml узел.
Но, так же мы можем, удалить последний xml узел и, не перебирая и получая все узлы, а сразу же обратившись к нему с помощью свойства LastNode.
xDoc.Root.LastNode.Remove();
результат

Удаление узла с атрибутом
Во втором примере задача остаётся той же, что и в первом примере, но только в данном случаи мы будем удалять узел, зная значение его атрибута. Например, удалим xml узел, который имеет атрибут id со значение три.
try
{
XDocument xDoc = XDocument.Load(pathToXmlFile);
foreach (XElement xNode in xDoc.Root.Nodes())
{
if (xNode.Attribute("id").Value == "3")
{
xNode.Remove();
}
}
}
catch (Exeption ex)
{
MessageBox.Show(ex.Message);
} В результате будет удалён третий (последний) узел в xml файле.
Удаление дочернего xml узла
Так же очень часто встречается задача, когда необходимо удалить дочерний узел в xml документе. Например, предположим, что нам необходимо удалить в созданном чуть ранее xml файле дочерний узел brothers.

решение:
try
{
XDocument xDoc = XDocument.Load(pathToXMLFile);
XNode xNodeTwo = xDoc.Root.Nodes().ElementAt(1);
((XElement)xNodeTwo).Element("brothers").Remove();
}
catch (Exeption ex)
{
MessageBox.Show(ex.Message);
} В данном примере сначала находим второй узел, а затем, используя операцию явного приведения и метод Remove, удаляем дочерний xml узел.
Обратиться ко второму узлу мы можем так же и, не используя метод Nodes, а например следующим образом:
XNode xNodeTwo = xDoc.Root.FirstNode.NextNode;
результат

Как удалить все узлы в xml файле?
И последний пример, в котором рассмотрим ситуацию, когда необходимо удалить все узлы в xml файле. Для решения данной задачи воспользуемся следующим решением:
try
{
XDocument xDoc = XDocument.Load(pathToXmlFile);
xDoc.Root.Nodes().Remove();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} В результате будут удалены все узлы в xml документе, кроме корневого узла!

Если же Вам необходимо удалить абсолютно все узлы, то тогда воспользуйтесь следующим способом:
xDoc.Root.Remove();
Update.
В данной статье, во многих приведенных примерах, используется явное и не явное приведение типа XNode к типу XElement, например:
foreach (XElement xNode in xDoc.Root.Nodes())
Такой способ можно использовать только в том случаи, если Вы точно уверены, что все узлы в xml файле имеют тип XElement (элемент). Если же при переборе в цикле мы попадем на другой тип, например комментарий (XComment), то в таком случае произойдет выброс исключения.
Поэтому, если Вам необходимо получить все узлы только типа XElement, то в таком случае лучше всего воспользоваться методом Descendants, например:
foreach (XElement xNode in xDoc.Descendants("friend")) Данный метод всегда возвращает только коллекцию элементов, что сразу избавляет нас от выше описанной проблемы.
Следующий пример так же приводит к возникновению исключения при тех же ранее описанных условиях:
((XElement)xNodeTwo).Element("brothers").Remove(); Чтобы этого избежать, можно добавить следующую проверку:
XElement elm = xNodeTwo as XElement;
if (elm != null)
{
elm.Element("brothers").Remove();
} На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.
Читайте также: