c# Как добавить xml узел ?

Как добавить новый узел в xml документе?

Продолжаем работу с технологией Linq to XML и сегодня Вы узнаете, как добавить xml узел в xml документе.

Добавление xml узла

И так для начала нам нужно создать и добавить в проект XML файл, после чего поместим в него структуру, которая была создана в самом начале статьи: «Как удалить xml узел в xml документе».

Затем создадим xml узел, который будем использовать во всех ниже приведенных примерах данной статьи.

XNode xNewNode = new XElement("friend", new XAttribute("id", 0),
new XElement("name", "Masha"),
new XElement("lastname", "Sidorova"),
new XElement("age", "27"));

xml узел

Каждый пример всегда начинается с загрузки xml файла и создания DOM дерева, поэтому не забывайте указывать первой строкой следующую запись:

XDocument xDoc = XDocument.Load("путь к xml файлу");

Чтобы получить доступ к классу XDocument, добавляем следующую строку:

using System.Xml.Linq;

А заканчивается каждый пример методом Save.

xDoc.Save(“путь к xml файлу”);

Если им не воспользоваться, то Вы не увидите внесенных Вами изменений в реальном xml файле, так как они останутся только в памяти.

На этом подготовительная часть закончена и теперь давайте рассмотрим несколько наиболее часто встречающихся операций.

Как добавить xml узел в конце документа?

Для решения данной задачи воспользуемся методом Add, в который в качестве параметра передадим имя добавляемого xml узла. Данный метод всегда по умолчанию добавляет новый узел в конце xml документа.

xDoc.Root.Add(xNewNode);

Либо мы можем обратиться к последнему узлу с помощью свойства LastNode и добавить новый узел с помощью метода AddAfterSelf.

xDoc.Root.LastNode.AddAfterSelf(xNewNode);

результат

метод Add

Как добавить xml узел между определенными узлами?

В этой примере рассмотрим задачу, в которой нам нужно добавить новый xml узел между уже существующим в xml документе вторым и третьим узлом.

Для решения данной задачи мы можем воспользоваться, например одним из двух методов:

1. AddAfterSelf — позволяет добавить новый узел после указанного узла, например:

xDoc.Root.Nodes().ElementAt(1).AddAfterSelf(xNewNode);

2. AddBeforeSelf, который так же добавляет новый xml узел, но только перед указанным узлом, например:

xDoc.Root.Nodes().ElementAt(2).AddBeforeSelf(xNewNode);

метод AddAfterSelf

В обоих примерах мы сначала с помощью метода Nodes получаем все узлы в текущем xml документе, а затем, используя метод ElementAt, указываем, от какого xml узла мы будем выполнять операцию добавления.

Результат в обоих случаях будет один и тот же.

метод AddBeforeSelf

Как добавить xml узел в начале xml документа?

xDoc.Root.Nodes().ElementAt(0).AddBeforeSelf(xNewNode);

В этом примере сначала так же находим все узлы, после чего выбираем первый из них и затем с помощью метода AddBeforeSelf добавляем новый узел.

Но, данный способ является не самым лучшим решением, так как сначала мы находим все узлы в xml документе, что нам по большому счету делать не нужно. Поэтому лучше всего будет сразу же обратиться к первому узлу с помощью свойства FirstNode и добавить перед ним новый узел, например следующим образом:

xDoc.Root.FirstNode.AddBeforeSelf(xNewNode);

результат

добавленный xml узел

Как добавить новый дочерний узел?

Чуть более "сложная" задача, в которой нам потребуется добавить дочерний xml узел после уже существующего дочернего узла brothers.

И так для начала нам нужно найти второй узел, например мы, можем сделать это следующим образом:

XNode xNodeTwo = xDoc.Root.Nodes().ElementAt(1);

Но опять же является ли рациональным данное решение? Вполне, так как в текущем xml документе всего 4 узла, поэтому поиск всех узлов не займет много времени. Но, если бы узлов в текущем документе было бы гораздо больше, то данное решение нам бы не подошло. Опять же, зачем нам нужно находить все узлы, когда мы можем сразу же напрямую обратиться ко второму узлу, например, так:

XNode xNodeTwo = xDoc.Root.FirstNode.NextNode;

После того, как второй узел был найден, нам осталось решить две задачи:

1. Найти дочерний узел brothers, например мы можем сделать это следующим образом:

((XElement)xNodeTwo).Element("brothers");

2. Добавить перед ним новый дочерний узел. Для этого мы опять же воспользуемся уже знакомый методом AddAfterSelf.

AddAfterSelf(xNewNode);

А теперь объединим всё в одно решение:

XNode xNodeTwo = xDoc.Root.FirstNode.NextNode;
((XElement)xNodeTwo).Element("brothers").AddAfterSelf(xNewNode);

результат

дочерний xml узел

На этом всё, если у Вас есть какие-то задачи связанные с данной темой, и Вы не знаете, как их решить или у Вас есть какие-то вопросы, то оставляйте их в комментариях постараюсь помочь.

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

3 комментария

  1. Сергей says:

    С номером ноды работать не всегда возможно.
    Как узнать номер ноды, в которой name = Петр?

    Допустим мы хотим добавить строку, в ноду, где name = Петр или id = 2
    XNode xNewNode = new XElement(«age», «98»);
    как это лучше сделать?

  2. Например, так:

    //находим узел
    var nodes = xDoc.Descendants("friend").Where(x => x.Element("name").Value.Equals("Пётр") &
    int.Parse(x.Attribute("id").Value) == 2);
    foreach (XElement node in nodes)
    {   //добавляем в узел дочерний элемент
    node.Add(new XElement("age", "98"));
    }
  3. Денис says:

    В комменте выше забыли написать, так как заранее не известна xml, то не известен и ее размер — если он будет большой, то загрузить не получится в память полностью из-за нехватки памяти.

Leave a Reply

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

*