Языки программирования

Работа с XML-файлами в C#

XML является одним из наиболее распространенных стандартов документов, который позволяет в удобной форме сохранять сложные по структуре данные. Поэтому разработчики платформы .NET включили в фреймворк широкие возможности для работы с XML.

XML (eXtensible Markup Language) — расширяемый язык разметки. XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете.

Рассмотрим, что представляет собой xml-документ и как он может хранить объекты, используемые в программе на C#. Есть следующий класс:
class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Company { get; set; }
}
В программе на C# можно создать список объектов класса User:
User user1 = new User { Name = "Bill Gates", Age = 48, Company = "Microsoft" };
User user2 = new User { Name = "Larry Page", Age = 42, Company = "Google" };
List users = new List { user1, user2 };
Чтобы сохранить список в формате xml можно использовать следующий xml-файл:
<?xml version="1.0" encoding="utf-8" ?>
<users>
  <user name="Bill Gates">
    <company>Microsoft</company>
    <age>48</age>
  </user>
  <user name="Larry Page">
    <company>Google</company>
    <age>48</age>
  </user>
</users>
XML-документ объявляет строка <?xml version=»1.0″ encoding=»utf-8″ ?>. Она задает версию (1.0) и кодировку (utf-8) xml. Далее идет собственно содержимое документа.

XML-документ должен иметь один единственный корневой элемент, внутрь которого помещаются все остальные элементы. В данном случае таким элементом является элемент <users>. Внутри корневого элемента задан набор элементов <user>. Вне корневого элемента нельзя разместить элементы user.

Каждый элемент определяется с помощью открывающего и закрывающего тегов, например, <user> и </user>, внутри которых помещается значение или содержимое элементов. Также элемент может иметь сокращенное объявление: <user /> — в конце элемента помещается слеш.

Элемент может иметь вложенные элементы и атрибуты. В данном случае каждый элемент user имеет два вложенных элемента company и age и атрибут name.

Названия элементов являются регистрозависимыми, поэтому <company> и <COMPANY> будут представлять разные элементы.

Для работы с XML в C# можно использовать несколько подходов. В первых версиях фреймворка основной функционал работы с XML предоставляло пространство имен System.Xml. В нем определен ряд классов, которые позволяют манипулировать xml-документом:

  • XmlNode: представляет узел xml. В качестве узла может использоваться весь документ, так и отдельный элемент;
  • XmlDocument: представляет весь xml-документ;
  • XmlElement: представляет отдельный элемент. Наследуется от класса XmlNode;
  • XmlAttribute: представляет атрибут элемента;
  • XmlText: представляет значение элемента в виде текста, то есть тот текст, который находится в элементе между его открывающим и закрывающим тегами;
  • XmlComment: представляет комментарий в xml;
  • XmlNodeList: используется для работы со списком узлов.

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

  • Свойство Attributes возвращает объект XmlAttributeCollection, который представляет коллекцию атрибутов;
  • Свойство ChildNodes возвращает коллекцию дочерних узлов для данного узла;
  • Свойство HasChildNodes возвращает true, если текущий узел имеет дочерние узлы;
  • Свойство FirstChild возвращает первый дочерний узел;
  • Свойство LastChild возвращает последний дочерний узел;
  • Свойство InnerText возвращает текстовое значение узла;
  • Свойство InnerXml возвращает всю внутреннюю разметку xml узла;
  • Свойство Name возвращает название узла. Например, <user> — значение свойства Name равно «user»;
  • Свойство ParentNode возвращает родительский узел у текущего узла.

Применим эти классы и их функционал. И вначале для работы с xml создаем новый файл. Называем его users.xml и определим в нем следующее содержание:
<?xml version="1.0" encoding="utf-8" ?>
<users>
  <user name="Bill Gates">
    <company>Microsoft</company>
    <age>48</age>
  </user>
  <user name="Larry Page">
    <company>Google</company>
    <age>42</age>
  </user>
</users>
Пройдемся по этому документу и выведем его данные на консоль:
using System.Xml;
class Program
{
    static void Main(string[] args)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("users.xml");
        // получим корневой элемент
        XmlElement xRoot = xDoc.DocumentElement;
        // обход всех узлов в корневом элементе
        foreach(XmlNode xnode in xRoot)
        {
            // получаем атрибут name
            if(xnode.Attributes.Count>0)
            {
                XmlNode attr = xnode.Attributes.GetNamedItem("name");
                if (attr!=null)
                    Console.WriteLine(attr.Value);
            }
              // обходим все дочерние узлы элемента user
            foreach(XmlNode childnode in xnode.ChildNodes)
            {
                // если узел - company
                if(childnode.Name=="company")
                {
                    Console.WriteLine("Компания: {0}", childnode.InnerText);
                }
                // если узел age
                if (childnode.Name == "age")
                {
                    Console.WriteLine("Возраст: {0}", childnode.InnerText);
                }
            }
            Console.WriteLine();
        }
        Console.Read();
    }
}
Для редактирования xml-документа (изменения, добавления, удаления элементов) можно воспользоваться методами класса XmlNode:

  • AppendChild: добавляет в конец текущего узла новый дочерний узел;
  • InsertAfter: добавляет новый узел после определенного узла;
  • InsertBefore: добавляет новый узел до определенного узла;
  • RemoveAll: удаляет все дочерние узлы текущего узла;
  • RemoveChild: удаляет у текущего узла один дочерний узел и возвращает его.

Класс XmlElement, унаследованный от XmlNode, добавляет еще ряд методов, которые позволяют создавать новые узлы:

  • CreateNode: создает узел любого типа;
  • CreateElement: создает узел типа XmlDocument;
  • CreateAttribute: создает узел типа XmlAttribute;
  • CreateTextNode: создает узел типа XmlTextNode;
  • CreateComment: создает комментарий.

Пример:
XmlDocument xDoc = new XmlDocument();
xDoc.Load("users.xml");
XmlElement xRoot = xDoc.DocumentElement;

// создаем новый элемент user
XmlElement userElem = xDoc.CreateElement("user");

// создаем атрибут name
XmlAttribute nameAttr = xDoc.CreateAttribute("name");

// создаем элементы company и age
XmlElement companyElem = xDoc.CreateElement("company");
XmlElement ageElem = xDoc.CreateElement("age");

// создаем текстовые значения для элементов и атрибута
XmlText nameText = xDoc.CreateTextNode("Mark Zuckerberg");
XmlText companyText = xDoc.CreateTextNode("Facebook");
XmlText ageText = xDoc.CreateTextNode("30");
Самоучитель по C#