TOC

This article has been localized into Russian by the community.

XML:

Запись XML с помощью класса XmlDocument

В предыдущей главе мы записывали XML с помощью класса XmlWriter. Тем не менее в некоторых случаях, особенно при изменении существующего XML, может пригодиться класс XmlDocument. Вы должны быть готовы к тому, что потребуется больше памяти, особенно при работе с большими XML-документами. Рассмотрим код:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WritingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            XmlNode rootNode = xmlDoc.CreateElement("users");
            xmlDoc.AppendChild(rootNode);

            XmlNode userNode = xmlDoc.CreateElement("user");
            XmlAttribute attribute = xmlDoc.CreateAttribute("age");
            attribute.Value = "42";
            userNode.Attributes.Append(attribute);
            userNode.InnerText = "John Doe";
            rootNode.AppendChild(userNode);

            userNode = xmlDoc.CreateElement("user");
            attribute = xmlDoc.CreateAttribute("age");
            attribute.Value = "39";
            userNode.Attributes.Append(attribute);
            userNode.InnerText = "Jane Doe";
            rootNode.AppendChild(userNode);

            xmlDoc.Save("test-doc.xml");
        }
    }
}

У нас получился следующий xml файл:

<users>
  <user age="42">John Doe</user>
  <user age="39">Jane Doe</user>
</users>

Как видите, это немного более объектно ориентированный подход, чем вариант с XmlWriter, и он требует немного меньше кода. Что мы делаем, так это создаем экземпляр объекта XmlDocument, который мы будем использовать для создания и новых элементов, и атрибутов с помощью методов CreateElement() и CreateAttribute(). Каждый раз когда мы будем это делать, мы добавляем элементы прямо в документ или в другой элемент. Вы можете увидеть это в примере, где корневой элемент ("users") добавляется прямо в документ, в то время как элементы user добавляются в корневой элемент. Атрибуты, конечно, добавляются в элементы, которым они принадлежат, с помощью метода Append() свойства Attributes. Содержимое XML-документа пишется на диск последней строкой кода, где используется метод Save().

Как уже было упомянуто, здесь требуется немного больше кода, чем когда мы использовали XmlWriter, но представьте ситуацию, когда вам нужно всего лишь открыть существующий XML-документ и изменить несколько значений. Используя подход с XmlWriter, вам пришлось бы сперва прочитать весь файл, используя XmlReader, сохранить его в памяти, изменить и только затем записать обратно, используя XmlWriter. Так как XmlDocument держит все в памяти для вас, изменение существующего XML-файла становится намного проще. Следующий пример открывает файл "test-doc.xml", который мы создали в предыдущей главе и увеличивает возраст (age) каждого пользователя (user). Посмотрите, как это просто:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WritingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("test-doc.xml");
            XmlNodeList userNodes = xmlDoc.SelectNodes("//users/user");
            foreach(XmlNode userNode in userNodes)
            {
                int age = int.Parse(userNode.Attributes["age"].Value);
                userNode.Attributes["age"].Value = (age + 1).ToString();
            }
            xmlDoc.Save("test-doc.xml");           
        }
    }
}

Мы загружаем XML-файл и запрашиваем все узлы <user>. Затем мы проходимся по каждому из них, считываем атрибут возраста (age) в переменную типа integer и затем после увеличения значения на 1 - записываем значение обратно в узел и атрибут. Наконец, мы перезаписываем документ в тот же файл и если вы откроете его, вы увидите что у всех наших пользователей только что был день рождения. Очень здорово!

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!