назад к списку статей

C# read xml. C# create xml. Работа с xml в Visual Studio

c# xml read createXML — текстовый формат, предназначенный для хранения структурированных данных. По сути – это база данных в текстовом структурированном файле. 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-разрядной среде

назад к списку статей

Поделитесь этой страницей со своими друзьями:

Нравится


I'mon Google+ .