Войти
Windows. Программы. Железо. Интернет. Безопасность. Мой компьютер
  • Как узнать, какая звуковая карта стоит на компьютере
  • Как восстановить сим карту МТС
  • Конструктор Arduino: новый взгляд сквозь SparkFun Pro Micro Arduino pro micro как работает
  • Ожидания и реалии в CRM-проектах Безапелляционный detail php id
  • Как узнать IMEI (серийный номер) iPhone?
  • Оптимизация OS X для продления жизни SSD
  • Простая запись и чтение XML с помощью XmlSerializer. Простая запись и чтение XML с помощью XmlSerializer Запись xml в файл

    Простая запись и чтение XML с помощью XmlSerializer. Простая запись и чтение XML с помощью XmlSerializer Запись xml в файл

    В данной статье я хочу описать метод записи и чтения XML-файлов с помощью класса XmlSerializer. Этот класс находится в пространстве имен System.Xml.Serialization сборки System.Xml.dll. Появился он достаточно давно – еще в первых версиях.NET. У объекта этого класса есть два интересных метода – Serialize и Deserialize. Эта статья о том, как прочитать или записать XML-файл почти любой структуры, описав его простыми классами на C#. Для понимания того, что пользоваться этими методами очень удобно, приведу пример класса:

    Public class Item { public int id; public string name; public List values; public bool CurrentStatus; } Этот класс достаточно просто преобразовать в следующий XML: 12.34Имя_элемента> 56.78Имя_элемента> Имя_коллекции> Имя_Корневого_Элемента> Для этого достаточно реализовать два метода, которые инкапсулируют обвес методов сериализации (SaveXml) и десериализации (LoadXml): public static bool SaveXml(object obj, string filename) { bool result = false; using (StreamWriter writer = new StreamWriter(filename)) { try { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(writer, obj, ns); result = true; } catch (Exception e) { // Логирование } finally { writer.Close(); } } return result; } public static object LoadXml(Type type, string filename) { object result = null; using (StreamReader reader = new StreamReader(filename)) { try { XmlSerializer serializer = new XmlSerializer(type); result = serializer.Deserialize(reader); } catch (Exception e) { // Логирование } finally { reader.Close(); } } return result; } Теперь приведу полный пример использования вышеописанных методов: Item item = new Item(); item.id = 42; item.name = "Имя элемента"; item.values = new List(); item.values.Add(12.34); item.values.Add(56.78); SaveXml(item, "d:\\obj.xml"); Item obj = LoadXml(typeof(Item), "d:\\obj.xml") as Item; Теперь немного о гибкости этого метода сериализации XML. Первый вопрос – как сериализовать член класса как атрибут узла. Для этого достаточно прикрепить к нему атрибут . Можно переименовать этот атрибут, используя параметр: . Если нам нужно сохранить член класса как обычный узел, то можно ничего не писать. Хотя, если нам нужно переименовать сам узел, то можно вставить атрибут . Относительно коллекций объектов нужно отметить, что переименовывать узлы коллекции также просто, как и обычные элементы. Для этого перед коллекцией вставляются атрибуты и . В качестве параметра этих атрибутов можно передать имена узлов, в которых будут храниться сама коллекция и ее элементы соответственно. Если мы не хотим сохранять какой-то элемент в XML, можно пометить его атрибутом . Описанный способ позволяет очень быстро "учить" программу работе с различными XML. И для этого не нужно для каждого формата XML писать отдельный код. Достаточно декларативно описать формат в виде класса C# с нужными атрибутами.

    — всем известные веб-страницы, которые также представляют из себя аналог XML с нестрогими проверками.

    Объекты чтения/записи XML, FastInfoset, HTML расширяют возможности чтения текстового файла встроенной обработкой тегов разметки.

    Также они используются для объектов ПостроительDOM/ЗаписьDOM (см. далее) как источники данных.

    Файлы XML 1С содержат текстовую информацию, то есть являются текстовыми файлами. Объекты ЧтениеXML 1С и ЗаписьXML 1С являются «надстройкой», позволяющей упростить работу с тегами XML файла 1С.

    Объекты ЧтениеFastInfoset 1С и ЗаписьFastInfoset 1С, ЧтениеHTML 1С и ЗаписьHTML 1С полностью аналогичны ЧтениеXML 1С и ЗаписьXML 1С и служат для работы таким же способом с другими форматами.

    Файл XML 1С, который использовался в примерах

    Справочник>

    Справочник>

    Текстовое значениеРеквизит>
    Справочник>
    Конфигурация>

    Пример 1. Считывание файла XML 1С в дерево значений с помощью ЧтениеXML 1С

    //открываем файл XML 1С на чтение с помощью ЧтениеXML 1С
    Файл = Новый ЧтениеXML();
    Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml");

    //подготовим дерево значений
    //у каждой ветки XML может быть наименование, атрибуты и значение
    дзXML = Новый ДеревоЗначений();
    дзXML.Колонки.Добавить("Наименование");
    дзXML.Колонки.Добавить("Значение");
    дзXML.Колонки.Добавить("Атрибуты");

    //так как атрибутов у строки XML может быть несколько - будем записывать их в таблицу значений
    //каждый атрибут имеет имя и значение
    тАтрибутов = Новый ТаблицаЗначений();
    тАтрибутов.Колонки.Добавить("Имя");
    тАтрибутов.Колонки.Добавить("Значение");

    //уровень вложенности поможет нам понимать когда требуется добавить вложенную ветку, а когда нужно вернуться на уровень вверх
    УровеньВложенности = 0;
    //текущая строка - строка дерева, будет меняться при увеличении вложенности
    ТекущаяСтрока = Неопределено;
    //чтение файла XML 1С производится не построчно, а по структуре, при окончании файла чтение вернет ЛОЖЬ
    Пока Файл.Прочитать() Цикл

    //нас интересуют три вида узлов - начало элемента, текст (значение элемента) и конец элемента (чтобы вернуться на уровень вверх)
    Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

    УровеньВложенности = УровеньВложенности + 1;

    //если это первая строка, то добавим ее в самый верх дерева и сохраним только наименование
    Если ТекущаяСтрока = Неопределено Тогда
    ТекущаяСтрока = дзXML.Строки.Добавить();
    ТекущаяСтрока.Наименование = Файл.Имя;
    Продолжить;
    Иначе
    //вложенные строки
    ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
    ТекущаяСтрока.Наименование = Файл.Имя; //сохраним наименование

    //есть ли у этого элемента XML атрибуты?
    Если Файл.КоличествоАтрибутов() > 0 Тогда
    //если да - скопируем подготовленную пустую таблицу для сохранения атрибутов
    тАтрибутыУзла = тАтрибутов.Скопировать();
    //цикл по количеству атрибутов у этого элемента
    Для Сч = 0 по Файл.КоличествоАтрибутов()-1 Цикл
    //для каждого атрибута запомним имя и значение
    Строка = тАтрибутыУзла.Добавить();
    Строка.Имя = Файл.ИмяАтрибута(Сч);
    Строка.Значение = Файл.ЗначениеАтрибута(Сч);
    КонецЦикла;
    //сохраним таблицу атрибутов элемента в текущую строку
    ТекущаяСтрока.Атрибуты = тАтрибутыУзла;
    КонецЕсли;
    КонецЕсли;

    ИначеЕсли Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
    //в начале элемента увеличиваем уровень вложенности, в конце элемента уменьшаем
    УровеньВложенности = УровеньВложенности - 1;
    //возвращаем текущую строку на уровень вверх
    ТекущаяСтрока = ТекущаяСтрока.Родитель;

    ИначеЕсли Файл.ТипУзла = ТипУзлаXML.Текст Тогда
    //если у элемента есть значение - просто сохраним его
    ТекущаяСтрока.Значение = Файл.Значение;

    КонецЕсли;

    КонецЦикла;

    Файл.Закрыть();

    Пример 2. Запись файла 1С XML с помощью объекта ЗаписьXML 1С

    //создаем файл ЗаписьXML 1С
    Файл = Новый ЗаписьXML();
    Файл.ОткрытьФайл("D:\СтруктураКонфигурации.xml", "UTF-8");
    Файл.ЗаписатьНачалоЭлемента("Конфигурация");

    //по метаданным обходим все справочники (подробнее см. "Работа с метаданными")
    Для каждого Справочник из Метаданные.Справочники Цикл

    //ЗаписатьНачалоЭлемента - открывает новую [подчиненную] ветку
    Файл.ЗаписатьНачалоЭлемента("Справочник");
    //ЗаписатьАтрибут - записывает атрибут в открытую ранее ветку
    Файл.ЗаписатьАтрибут("Имя", Справочник.Имя);
    Файл.ЗаписатьАтрибут("Синоним", Справочник.Синоним);

    //по метаданным обходим все реквизиты справочника
    Для каждого Реквизит из Справочник.Реквизиты Цикл




    КонецЦикла;

    //по метаданным обходим все табличные части справочника
    Для каждого ТЧ из Справочник.ТабличныеЧасти Цикл
    Файл.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
    Файл.ЗаписатьАтрибут("Имя", ТЧ.Имя);
    Файл.ЗаписатьАтрибут("Синоним", ТЧ.Синоним);

    Для каждого Реквизит из ТЧ.Реквизиты Цикл
    Файл.ЗаписатьНачалоЭлемента("Реквизит");
    Файл.ЗаписатьАтрибут("Имя", Реквизит.Имя);
    Файл.ЗаписатьАтрибут("Синоним", Реквизит.Синоним);
    Файл.ЗаписатьКонецЭлемента();
    КонецЦикла;

    Файл.ЗаписатьКонецЭлемента();
    КонецЦикла;

    //ЗаписатьКонецЭлемента - "закрывает" открытую ранее с помощью ЗаписатьНачалоЭлемента ветку
    Файл.ЗаписатьКонецЭлемента();
    КонецЦикла;

    Файл.ЗаписатьКонецЭлемента();
    Файл.Закрыть();