Приветствую всех! Сегодня посмотрим классы и методы работы с файлами XML.
XML-eXtensible Markup Language-Текстовый формат, предназначенный для хранения структурированных данных для обмена информацией между программами, а
также для создания на его основе более специализированных языков разметки.
XML — это описанная в текстовом формате иерархическая структура, предназначенная для хранения любых структурированных данных. Визуально структура может быть представлена как дерево элементов. Элементы XML описываются тегами. Основан на принципах иерархии.
Документ XML:
• объявление XML – Первая строка XML-документа называется объявлением XML (англ. XML declaration) -это строка, указывающая версию XML. В версии 1.0 объявление XML может быть опущено, но, начиная с версии 1.1, оно обязательно. Также здесь может быть указана кодировка символов и наличие внешних зависимостей.
• Корневой элемент — документ имеет только один корневой элемент (англ. root element) (так же иногда называемый элемент документа (англ. document element)). Это означает,
что текст или другие данные всего документа должны быть расположены между единственным начальным корневым тегом и соответствующим ему конечным тегом.
• теги – Теги — остальная часть этого XML-документа, которая состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержимое. Элемент обычно состоит из открывающего и закрывающего тегов, обрамляющих текст и другие элементы. Открывающий тег состоит из имени элемента в угловых скобках, а закрывающий тег
состоит из того же имени в угловых скобках, но перед именем ещё добавляется косая черта. Имена элементов, как и имена атрибутов, не могут содержать пробелы, но могут
быть на любом языке, поддерживаемом кодировкой XML-документа. Имя может начинаться с буквы, подчёркивания, двоеточия. Остальными символами имени могут быть те же символы, а также цифры, дефис, точка.
• комментарии – Комментарий — в любом месте дерева может быть размещен элемент-комментарий. XML-комментарии размещаются внутри специального тега, начинающегося с символов <!— и заканчивающегося символами —>. Два знака дефис (—) внутри комментария присутствовать не могут.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
<!--Определение документа, оно должно быть всегда -->
<?xml version=“1.0” encoding=“utf-8”?>
<!--Корневой элемент должен быть один-->
<rootElement>
<!--Обычный элемент может иметь атрибуты и текст-->
<firstElement attribute="значения 1" attribute="значение 2">
<!--Иерархия элемента второго уровня, подчиненная предыдущему-->
<secondElement>любой текст<\secondElement >
</firstElement
</rootElement> |
XML-классы в пространстве имен System.Xml образуют полнофункциональный интегрированный набор классов, позволяющий работать с XML-документами и данными. XML-классы поддерживают синтаксический анализ и запись XML-кода, изменение XML-данных в памяти, проверку данных и преобразование XSLT.
XmlAttribute: атрибут элемента.
XmlDeclaration: описание документа.
XmlDocument: документ XML.
XmlElement: элемент XML.
XmlNode: узел, может быть как весь документ, так и отдельные элемент.
Основным классом для работы с XML является XmlNode
Attributes-колекция атрибутов узла.
ChildNodes-коллекция дочерних узлов.
FirstChild—первый дочерний узел.
HasChildNodes—признак наличия дочерних узлов
InnerText—возвращает текст узла
InnerXml—возвращает все содержимое xml
ParentNode—родитель текущего узела
Value-получить значение
Классы для работы с XML
XmlDocument — Предоставляет XML-документ для дальнейшей работы с ним.
XmlTextReader — Предоставляет средство чтения, обеспечивающее быстрый прямой доступ (без кэширования) к данным XML.
XmlTextWriter — Представляет средство записи, предоставляющее способ быстрого прямого создания потоков (без кэширования) или файлов с данными XML, которые соответствуют рекомендациям консорциума W3C по языку XML версии 1.0 и пространств имен в XML.
XmlDocument основные методы и свойство:
Load()-загрузает документ из внешнего источника.
LoadXml()-создает документ из строки с XML.
Greate()-создает соответствующий объект.
Save()-сохраняет документ.
DocumentElement-корневой элемент документа.
XmlElement основные методы и свойство:
XmlElement-представляет собой элемент, может иметь атрибуты, а также может иметь дочерние элементы.
GetAttribute()-возвращает значения атрибута по его имени.
Name-имя текущего элемента.
Remove-удаляет соответствующий объект.
SetAttribute()-добавляет в элемент новый атрибут с именем и значением.
XML Path Language
XPath (XML Path Language) — язык запросов к элементам XML-документа.
Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML.
Пространство имен XPath
Пространство имен, позволяющее использовать возможности языка XPath (XML Path Language).
Содержит класс XPathDocument, позволяющий создавать экземпляры XPathNavigator.
XPathNavigator – предоставляет курсор-ориентированную модель для просмотра и редактирования XML данных.
Основные классы для чтения и записи данных XML в пространстве имен System.Xml:
XmlReader, XmlWriter, XmlTextReader, XmlTextWriter.
XmlReader — обеспечивает последовательный доступ только для чтения к потоку XML-данных. Умеет работать только в одном направлении (вперед).
XmlWriter – Представляет средство записи, обеспечивающее быстрый прямой способ (без кэширования) создания потоков файлов, содержащих XML-данные.
XmlWriter позволяет: проверять допустимость XML-символов и допустимость XML-имен элементов и атрибутов, проверять правильность формата XML-документа, передавать значения, используя типы среды CLR вместо строк, записывать несколько документов в выходной поток, записывать допустимые имена, полные имена и маркеры имен.
XmlTextReader – расширяет класс XmlReader. Обеспечивает быстрый однонаправленный потоковый доступ к данным XML.
XmlTextWriter — расширяет класс XmlWriter. Обеспечивает быструю однонаправленную генерацию потоков данных XML.
XmlNode — предоставляет отдельный узел в XML-документе.
XPath (XML Path Language) — язык запросов к элементам XML-документа.
Пространство имен System.Xml.XPath содержит классы, определяющие модель курсора для переходов и изменения элементов сведений XML и предназначено для обеспечения высокой скорости работы.
XPathDocument – представляет собой быстрое, доступное только для чтения, хранимое в памяти представление XML-документа с помощью модели данных XPath. Его единственной задачей является создание навигаторов XPathNavigator. Создавать класс XPathDocument можно несколькими способами. Можно передать его конструктору
экземпляр XmlReader, имя файла XML-документа или объект, основанный на Stream. Это обеспечивает значительную гибкость, например, можно сначала применить
XmlValidatingReader для проверки правильности XML-документа и затем воспользоваться этим же объектом для создания XPathDocument.
XPathNavigator — представляет модель курсора для навигации по данным XML и их редактирования.
Теперь перейдем к рассмотрению примеров в работе с Xml файлом:
Загрузка и чтение содержимого из файла XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
static void Main()
{
// Загрузка XML из файла.
var doc = new XmlDocument();
doc.Load("my.xml");
// Показ содержимого XML.
Console.WriteLine(doc.InnerText);
Console.WriteLine(new string('-', 20));
// Показ кода XML документа.
Console.WriteLine(doc.InnerXml);
// Delay.
Console.ReadKey();
} |
Альтернативный пример того как можно прочитать содержимое XML из строки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
static void Main()
{
string xmlData = "<?xml version='1.0' encoding='utf-8' ?><Book><Title>CLR via C#</Title></Book>";
var stringReader = new StringReader(xmlData);
var reader = new XmlTextReader(stringReader);
while (reader.Read())
{
Console.WriteLine("{0,-15} {1,-10} {2,-10}",
reader.NodeType.ToString(),
reader.Name,
reader.Value);
}
reader.Close();
// Delay.
Console.ReadKey();
} |
Осуществляем обход всех элементов XML файла.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
static void Main()
{
var document = new XmlDocument();
document.Load("books.xml");
XmlNode root = document.DocumentElement;
// Напечатает "document.DocumentElement=ListOfBooks"
Console.WriteLine("document.DocumentElement = {0}", root.LocalName);
foreach (XmlNode books in root.ChildNodes)
{
Console.WriteLine("Found Book:");
foreach (XmlNode book in books.ChildNodes)
{
Console.WriteLine(book.Name + ": " + book.InnerText);
}
Console.WriteLine(new string('-',40));
}
// Delay.
Console.ReadKey();
} |
Производим чтение атрибутов.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
static void Main()
{
var reader = new XmlTextReader("books.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
// Проверка на тип узла необходима, иначе будут найдены не только открывающие элементы (XmlNodeType.Element),
// но и закрывающие (XmlNodeType.EndElement).
if (reader.Name.Equals("Title")) // Закомментировать и выполнить.
{
Console.WriteLine("<{0}>", reader.GetAttribute("FontSize"));
}
}
}
// Delay.
Console.ReadKey();
} |
Чтение всех атрибутов.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
static void Main()
{
var reader = new XmlTextReader("books.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.HasAttributes)
{
while (reader.MoveToNextAttribute())
{
Console.WriteLine("{0} = {1}", reader.Name, reader.Value);
}
}
}
}
// Delay.
Console.ReadKey();
} |
Создаем XML файл и вносим в него значения и атрибуты.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 |
static void Main()
{
var xmlWriter = new XmlTextWriter("books.xml", null);
xmlWriter.WriteStartDocument(); // <?xml version="1.0"?>
xmlWriter.WriteStartElement("ListOfBooks"); // <ListOfBooks>
xmlWriter.WriteStartElement("Book"); // <Book>
xmlWriter.WriteString("Title-1"); // Title-1
xmlWriter.WriteEndElement(); // </Book>
xmlWriter.WriteStartElement("Book"); // <Book>
xmlWriter.WriteString("Title-2"); // Title-2
xmlWriter.WriteEndElement(); // </Book>
xmlWriter.WriteEndElement(); // </ListOfBooks>
xmlWriter.Close();
// Delay.
Console.ReadKey();
} |
Для создания комментария используем метод:
1 |
xmlWriter.WriteComment("Строка комментария."); |
Выборка из XML с помощью XPath.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 |
static void Main()
{
// Создание XPath документа.
var document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Прямой запрос XPath.
XPathNodeIterator iterator1 = navigator.Select("ListOfBooks/Book/Title");
while (iterator1.MoveNext())
{
Console.WriteLine(iterator1.Current);
}
Console.WriteLine(new string('-',20));
// Скомпилированный запрос XPath
XPathExpression expr = navigator.Compile("ListOfBooks/Book[2]/Price");
XPathNodeIterator iterator2 = navigator.Select(expr);
while (iterator2.MoveNext())
{
Console.WriteLine(iterator2.Current);
}
// Delay.
Console.ReadKey();
} |
Создание навигаторов — XPathNavigator и редактирования файла при помощи него.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
static void Main()
{
// Создание XPath документа.
var document = new XPathDocument("books.xml");
// Единственное назначение XPathDocument - создание навигатора.
XPathNavigator navigator = document.CreateNavigator();
// При создании навигатора при помощи XPathDocument возможно выполнять только чтение.
Console.WriteLine("Навигатор создан только для чтения. Свойство CanEdit = {0}.", navigator.CanEdit);
// Используя XmlDocument навигатор можно использовать и для редактирования.
var xmldoc = new XmlDocument();
xmldoc.Load("books.xml");
navigator = xmldoc.CreateNavigator();
Console.WriteLine("Навигатор получил возможность редактирования. Свойство CanEdit = {0}.", navigator.CanEdit);
// Теперь можно попробовать что-то записать в XML-документ.
// Выполняем навигацию к узлу Book.
navigator.MoveToChild("ListOfBooks", "");
navigator.MoveToChild("Book", "");
// Проводим вставку значений.
navigator.InsertBefore("<InsertBefore>insert_before</InsertBefore>");
navigator.InsertAfter("<InsertAfter>insert_after</InsertAfter>");
navigator.AppendChild("<AppendChild>append_child</AppendChild>");
navigator.MoveToNext("Book", "");
navigator.InsertBefore("<InsertBefore>1111111111</InsertBefore>");
navigator.InsertAfter("<InsertAfter>2222222222</InsertAfter>");
navigator.AppendChild("<AppendChild>3333333333</AppendChild>");
// Сохраняем изменения.
xmldoc.Save("books.xml");
// Delay.
Console.ReadKey();
} |
Используем LINQ в XML
Быстрее и легче работать с xml форматом используя Linq, для этих целей мы подключим System.Xml.Linq
Основные классы
- XAttribute: представляет атрибут xml-элемента
- XComment: представляет комментарий
- XDocument: представляет весь xml-документ
- XElement: представляет отдельный xml-элемент
XElement и его методы:
- Add(): добавляет новый атрибут или элемент
- Attributes(): возвращает коллекцию атрибутов для данного элемента
- Elements(): возвращает все дочерние элементы данного элемента
- Remove(): удаляет данный элемент из родительского объекта
- RemoveAll(): удаляет все дочерние элементы и атрибуты у данного элемента
Создания XML файла с содержимым.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
//создаем фаил xml
XDocument xdoc = new XDocument();
// создаем корневой элемент
XElement el1 = new XElement("MyContacts");
// создаем атрибут
XAttribute attr = new XAttribute("TelephoneNumber", "906181733");
//создает элемент
XElement el2 = new XElement("Contact", "Alex");
//помещаем в элемент, атрибут
el2.Add(attr);
//помещаем элелемент в корневой элемент
el1.Add(el2);
//помещаем элелементы в документ
xdoc.Add(el1);
//сохраняем документ
xdoc.Save("TelephoneBook.xml");
//<? xml version = "1.0" encoding = "utf-8" ?>
//< MyContacts >
// < Contact TelephoneNumber = "906181733" > Alex </ Contact >
//</ MyContacts > |
Имея фаил мы можем вывести всю информацию в консоль:
1
2
3
4
5
6
7
8 |
XDocument xdoc = XDocument.Load("TelephoneBook.xml");
foreach (XElement contact in xdoc.Element("MyContacts").Elements("Contact"))
{
XAttribute numAttr = contact.Attribute("TelephoneNumber");
Console.WriteLine("Номер: {0}", numAttr.Value);
Console.WriteLine("Имя: {0}", contact.Value);
} |
Теперь попробуем добавить новый контакт и номер телефона:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
XDocument xdoc = XDocument.Load("TelephoneBook.xml");
XElement root = xdoc.Element("MyContacts");
XAttribute attr = new XAttribute("TelephoneNumber", "45345676");
//создает элемент
XElement el2 = new XElement("NewContact", "Andrey");
//помещаем в элемент, атрибут
el2.Add(attr);
root.Add(el2);
xdoc.Save("TelephoneBook.xml");
//<?xml version="1.0" encoding="utf-8"?>
//<MyContacts>
// <Contact TelephoneNumber="906181733">Alex</Contact>
// <NewContact TelephoneNumber="45345676">Andrey</NewContact>
//</MyContacts> |
Теперь изменим в контакте, норме и имя
1
2
3
4
5
6
7
8
9
10
11 |
XDocument xdoc = XDocument.Load("TelephoneBook.xml");
foreach (XElement contact in xdoc.Element("MyContacts").Elements("Contact"))
{
XAttribute numAttr = contact.Attribute("TelephoneNumber");
if(contact.Value == "Alex")
{
contact.Value = "Сергей";
numAttr.Value = "55543456";
}
}
xdoc.Save("TelephoneBook.xml"); |