XML является одним из наиболее распространенных стандартов документов, который позволяет в удобной форме сохранять сложные по структуре данные. Поэтому разработчики платформы .NET включили в фреймворк широкие возможности для работы с XML.
XML (eXtensible Markup Language) — расширяемый язык разметки. XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете.
Рассмотрим, что представляет собой xml-документ и как он может хранить объекты, используемые в программе на C#. Есть следующий класс:
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-документом:
Ключевым классом, который позволяет манипулировать содержимым xml, является XmlNode, его основные методы и свойства:
Применим эти классы и их функционал. И вначале для работы с xml создаем новый файл. Называем его users.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:
Класс XmlElement, унаследованный от 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");