Как удалить узел в 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(); }
На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.
Читайте также: