C# read xml. C# create xml. Работа с xml в Visual Studio
XML — текстовый формат, предназначенный для хранения структурированных данных. По сути – это база данных в текстовом структурированном файле. XML имеет реализации парсеров для всех современных языков программирования и средств разработки.
В Visual Studio существует множество способов работы с xml (все они находятся в пространстве имен System.Xml):
- XmlTextReader, XmlTextWriter;
- XmlDocument;
- Linq.XDocument;
- Schema.XmlSchema.
На мой взгляд, самый простой, гибкий и интуитивно понятный способ обработки xml файла – с помощью классов XmlTextReader и XmlTextWriter. К тому же он показывает весьма неплохие результаты по скорости работы.
Материал подается последовательно, поэтому если вам нужно просто посмотреть пример работы с xml, можете сразу перейти к интересующему разделу:
Первым делом создадим консольное приложение в Visual Studio. Назовем его XMLReadWrite. Будем изучать чтение и запись xml на C# на примере xml файла, содержащего сведения об авторе и его книгах. Создайте в папке XMLReadWrite \bin\Debug xml-файл author.xml со следующим содержимым:
<?xml version="1.0" encoding="windows-1251"?>
<Автор>
<ФИО>Иванов Иван Иванович</ФИО>
<Дата_рождения>31.12.1988</Дата_рождения>
<Пол>Мужской</Пол>
<Книга id="1">
<Название>Название1</Название>
<Количество_страниц>20</Количество_страниц>
</Книга>
<Книга id="2">
<Название>Название2</Название>
<Количество_страниц>40</Количество_страниц>
</Книга>
</Автор>
Подключим в нашем проекте пространства имен:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
Для демонстрации примера нам понадобятся два класса: «Автор» и «Книга»:
public class Author
{
public string fio = string.Empty;
public DateTime birthDay = DateTime.MinValue;
public string sex = string.Empty;
public List<Book> books = new List<Book>();
}
public class Book
{
public int id = -1;
public string name = string.Empty;
public int pageCount = -1;
}
Класс Author содержит сведения об авторе: ФИО, дата рождения, пол и список книг.
Класс Book содержит идентификатор книги (уникальный в пределах одного автора), название и количество страниц.
C# read xml
Напишем функцию ReadXml по чтению xml файла. На вход подадим имя нашего файла author.xml, на выходе получим прочитанного автора.
На C# read xml осуществляется с помощью класса XmlTextReader. Он доступен во всех версиях .Net Framework, начиная с 1.0. XmlTextReader реализует методы «только вперед», т.е. обеспечивает строго последовательный обход XML-файла. За счет этого достигается весьма хорошая скорость обработки данных.
static Author ReadXml(string fileName)
{
Author author = new Author();
using (XmlTextReader reader = new XmlTextReader(fileName))
{
while (reader.Read())
{
if (reader.IsStartElement("Автор") && !reader.IsEmptyElement)
{
while (reader.Read())
{
if (reader.IsStartElement("ФИО"))
author.fio = reader.ReadString();
else if (reader.IsStartElement("Дата_рождения"))
author.birthDay = DateTime.Parse(reader.ReadString());
else if (reader.IsStartElement("Пол"))
author.sex = reader.ReadString();
else if (reader.IsStartElement("Книга") && !reader.IsEmptyElement)
{
Book book = new Book();
book.id = Int32.Parse(reader.GetAttribute(0));
while (reader.Read())
{
if (reader.IsStartElement("Название"))
book.name = reader.ReadString();
else if (reader.IsStartElement("Количество_страниц"))
book.pageCount = Int32.Parse(reader.ReadString());
else if (!reader.IsStartElement() && reader.Name == "Книга")
{
author.books.Add(book);
break;
}
}
}
else if (!reader.IsStartElement() && reader.Name == "configuration")
break;
}
}
}
}
return author;
}
Примечание: при чтении тега, который подразумевает вложенность, нужно помимо проверки reader.IsStartElement("Книга") еще проверять, что этот элемент не пустой !reader.IsEmptyElement. Иначе при наличии такой конструкции <книга /> (т.е. открывающийся тег является и закрывающимся) программа войдет во вложенный цикл и уже не выйдет из него до окончания xml файла.
C# create xml
Теперь напишем функцию WriteXml. На вход подадим имя нового файла newAuthor.xml и сформированный предыдущей функцией Author.
Для создания на C# create xml файла будем использовать класс XmlTextWriter . С помощью него можно задавать параметры форматирования xml. Например, в нашей функции для отступа тегов используется один знак табуляции.
Функция WriteStartDocument() формирует объявление XML. Это строка, указывающая версию XML документа. В версии 1.0 объявление XML может отсутствовать, в версии 1.1 оно является обязательным. Также здесь указывается кодировка символов. В нашем случае функция версия вернет строку <?xml version="1.0" encoding="windows-1251"?>
Вложенные теги создаются с помощью функции WriteStartElement(). На каждый WriteStartElement() должен быть закрывающий его WriteEndElement().
static void WriteXml(string fileName, Author author)
{
using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.GetEncoding(1251)))
{
writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
writer.WriteStartDocument();
writer.WriteStartElement("Автор");
{
writer.WriteElementString("ФИО", author.fio);
writer.WriteElementString("Дата_рождения", author.birthDay.ToString("dd.MM.yyyy"));
writer.WriteElementString("Пол", author.sex);
foreach (Book book in author.books)
{
writer.WriteStartElement("Книга");
writer.WriteAttributeString("id", book.id.ToString());
{
writer.WriteElementString("Название", book.name);
writer.WriteElementString("Количество_страниц", book.pageCount.ToString());
}
writer.WriteEndElement();
}
}
writer.WriteEndElement();
}
}
В основной функции программы Main создадим экземпляр класса Author, вызовем функцию ReadXml по чтению данных об авторе из xml-файла author.xml, а затем создадим новый файл newAuthor.xml с помощью WriteXml и запишем в него сведения об авторе. По окончании работы программы у нас должно быть два одинаковых xml-файла.
static void Main(string[] args)
{
Author author = ReadXml("author.xml");
WriteXml("newAuthor.xml", author);
}
полный листинг программы на C# xml read and create
В конце статьи приведен полный листинг программы:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace XMLReadWrite
{
class Program
{
static void Main(string[] args)
{
Author author = ReadXml("author.xml");
WriteXml("newAuthor.xml", author);
}
private class Author
{
public string fio = string.Empty;
public DateTime birthDay = DateTime.MinValue;
public string sex = string.Empty;
public List<Book> books = new List<Book>();
}
private class Book
{
public int id = -1;
public string name = string.Empty;
public int pageCount = -1;
}
static Author ReadXml(string fileName)
{
Author author = new Author();
using (XmlTextReader reader = new XmlTextReader(fileName))
{
while (reader.Read())
{
if (reader.IsStartElement("Автор") && !reader.IsEmptyElement)
{
while (reader.Read())
{
if (reader.IsStartElement("ФИО"))
author.fio = reader.ReadString();
else if (reader.IsStartElement("Дата_рождения"))
author.birthDay = DateTime.Parse(reader.ReadString());
else if (reader.IsStartElement("Пол"))
author.sex = reader.ReadString();
else if (reader.IsStartElement("Книга") && !reader.IsEmptyElement)
{
Book book = new Book();
book.id = Int32.Parse(reader.GetAttribute(0));
while (reader.Read())
{
if (reader.IsStartElement("Название"))
book.name = reader.ReadString();
else if (reader.IsStartElement("Количество_страниц"))
book.pageCount = Int32.Parse(reader.ReadString());
else if (!reader.IsStartElement() && reader.Name == "Книга")
{
author.books.Add(book);
break;
}
}
}
else if (!reader.IsStartElement() && reader.Name == "configuration") break;
}
}
}
}
return author;
}
static void WriteXml(string fileName, Author author)
{
using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.GetEncoding(1251)))
{
writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
writer.WriteStartDocument();
writer.WriteStartElement("Автор");
{
writer.WriteElementString("ФИО", author.fio);
writer.WriteElementString("Дата_рождения", author.birthDay.ToString("dd.MM.yyyy"));
writer.WriteElementString("Пол", author.sex);
foreach (Book book in author.books)
{
writer.WriteStartElement("Книга");
writer.WriteAttributeString("id", book.id.ToString());
{
writer.WriteElementString("Название", book.name);
writer.WriteElementString("Количество_страниц", book.pageCount.ToString());
}
writer.WriteEndElement();
}
}
writer.WriteEndElement();
}
}
}
}

Вам также может быть интересно:
Отправка email на C#
Пример использования 7-zip в .Net
Маска файла с помощью регулярных выражений
Построение x64 проекта установки в 32-разрядной среде
|