Удаление узла в xml документе

Как удалить узел в 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;

ключевое слово using

Удаление 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 узла

Удаление узла с атрибутом

Во втором примере задача остаётся той же, что и в первом примере, но только в данном случаи мы будем удалять узел, зная значение его атрибута. Например, удалим 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.

атрибут xml узла

решение:

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 документе, кроме корневого узла!

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

На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.

Читайте также:

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*