Чтение и запись XML в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.xml, который используется в примерах ниже.

/// Как прочитать файл в формате XML через DOM
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура ПрочитатьФайлXMLЧерезDOM(ПутьКФайлу)
 
    // Разбор документа через DOM (document object model)
    // https://ru.wikipedia.org/wiki/Document_Object_Model
 
    // Разбираем файл test.xml, ссылка на его скачивание выше.
 
    Парсер = Новый ЧтениеXML;
    Парсер.ОткрытьФайл(ПутьКФайлу);
 
    Построитель = Новый ПостроительDOM;
 
    Документ = Построитель.Прочитать(Парсер);
 
    Для Каждого Элемент0 Из Документ.ЭлементДокумента.ДочерниеУзлы Цикл
        Если Элемент0.ИмяУзла = "Страна" Тогда
            Страна = Элемент0;
 
            Название = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Название");
            Если Название <> Неопределено Тогда
                Сообщить("== " + Название.Значение + " ==");
            КонецЕсли;
 
            Численность = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Численность");
            Если Численность <> Неопределено Тогда
                Сообщить("Численность: " + Численность.Значение);
            КонецЕсли;
 
            Столица = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Столица");
            Если Столица <> Неопределено Тогда
                Сообщить("Столица: " + Столица.Значение);
            КонецЕсли;
 
            Для Каждого Элемент1 Из Страна.ДочерниеУзлы Цикл
                Если Элемент1.ИмяУзла = "ТрадиционныеБлюда" Тогда
                    ТрадиционныеБлюда = Элемент1;
 
                    Сообщить("Традиционные блюда:");
 
                    Для Каждого Элемент2 Из ТрадиционныеБлюда.ДочерниеУзлы Цикл
                        Если Элемент2.ИмяУзла = "Блюдо" Тогда
                            Блюдо = Элемент2;
 
                            Название = Блюдо.Атрибуты.ПолучитьИменованныйЭлемент("Название");
                            Если Название <> Неопределено Тогда
                                Сообщить(" " + Название.Значение);
                            КонецЕсли;
                        КонецЕсли;
                    КонецЦикла;                    
                ИначеЕсли Элемент1.ИмяУзла = "ОбщееОписание" Тогда
                    Сообщить("Общее описание:");
                    Сообщить(Элемент1.ТекстовоеСодержимое);
                КонецЕсли;                
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
 
    Парсер.Закрыть();
 
КонецПроцедуры
 
/// Как прочитать файл в формате XML последовательно
/// (способ 1) в 1с 8.3, 8.2
 
&НаСервере
Процедура ПрочитатьФайлXMLПоследовательноСпособ1(ПутьКФайлу)
 
    // Этот способ подойдёт для очень больших файлов,
    // для которых модель DOM неприменима.
 
    // Способ 1.
 
    // Разбираем файл test.xml, ссылка на его скачивание выше.
 
    Парсер = Новый ЧтениеXML;
    Парсер.ОткрытьФайл(ПутьКФайлу);
 
    Пока Парсер.Прочитать() Цикл
        Если 
            Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
            Парсер.Имя = "Страна"
        Тогда
            Название = Парсер.ЗначениеАтрибута("Название");
            Если Название <> Неопределено Тогда
                Сообщить("== " + Название + " ==");
            КонецЕсли;
 
            Численность = Парсер.ЗначениеАтрибута("Численность");
            Если Численность <> Неопределено Тогда
                Сообщить("Численность: " + Численность);
            КонецЕсли;
 
            Столица = Парсер.ЗначениеАтрибута("Столица");
            Если Столица <> Неопределено Тогда
                Сообщить("Столица: " + Столица);
            КонецЕсли;
 
            Пока Парсер.Прочитать() Цикл // <Страна>
                Если 
                    Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
                    Парсер.Имя = "ТрадиционныеБлюда"
                Тогда                    
                    Сообщить("Традиционные блюда:");
 
                    Пока Парсер.Прочитать() Цикл // <ТрадиционныеБлюда>
                        Если 
                            Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
                            Парсер.Имя = "Блюдо" 
                        Тогда
                            Название = Парсер.ЗначениеАтрибута("Название");
                            Если Название <> Неопределено Тогда
                                Сообщить(" " + Название);
                            КонецЕсли;
                        ИначеЕсли
                            Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента И
                            Парсер.Имя = "ТрадиционныеБлюда"
                        Тогда
                            Прервать;
                        КонецЕсли;
                    КонецЦикла; //  </ТрадиционныеБлюда>
 
                ИначеЕсли
                    Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И
                    Парсер.Имя = "ОбщееОписание"
                Тогда                
                    Парсер.Прочитать();
                    Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда
                        Сообщить("Общее описание:");
                        Сообщить(Парсер.Значение);
                    КонецЕсли;                
                ИначеЕсли
                    Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента И
                    Парсер.Имя = "Страна"
                Тогда
                    Прервать;
                КонецЕсли;
            КонецЦикла; // </Страна>
 
        КонецЕсли;
    КонецЦикла;
 
    Парсер.Закрыть();
 
КонецПроцедуры
 
/// Как прочитать файл в формате XML последовательно
/// (способ 2) в 1с 8.3, 8.2
 
&НаСервере
Процедура ПрочитатьФайлXMLПоследовательноСпособ2(ПутьКФайлу)
 
    // Этот способ подойдёт для очень больших файлов,
    // для которых модель DOM неприменима.
 
    // Способ 2.
 
    // Разбираем файл test.xml, ссылка на его скачивание выше.
 
    Парсер = Новый ЧтениеXML;
    Парсер.ОткрытьФайл(ПутьКФайлу);
 
    СтекИмен = Новый СписокЗначений;
 
    Пока Парсер.Прочитать() Цикл
        Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            СтекИмен.Добавить(Парсер.Имя);
            ПолныйПуть = ПостроитьПуть(СтекИмен);
 
            Если ПолныйПуть = "/Страны/Страна" Тогда
                Название = Парсер.ЗначениеАтрибута("Название");
                Если Название <> Неопределено Тогда
                    Сообщить("== " + Название + " ==");
                КонецЕсли;
 
                Численность = Парсер.ЗначениеАтрибута("Численность");
                Если Численность <> Неопределено Тогда
                    Сообщить("Численность: " + Численность);
                КонецЕсли;
 
                Столица = Парсер.ЗначениеАтрибута("Столица");
                Если Столица <> Неопределено Тогда
                    Сообщить("Столица: " + Столица);
                КонецЕсли;
            ИначеЕсли ПолныйПуть = "/Страны/Страна/ТрадиционныеБлюда" Тогда
                Сообщить("Традиционные блюда:");
            ИначеЕсли ПолныйПуть = "/Страны/Страна/ТрадиционныеБлюда/Блюдо" Тогда
                Название = Парсер.ЗначениеАтрибута("Название");
                Если Название <> Неопределено Тогда
                    Сообщить(" " + Название);
                КонецЕсли;
            ИначеЕсли ПолныйПуть = "/Страны/Страна/ОбщееОписание" Тогда
                Парсер.Прочитать();
                Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда
                    Сообщить("Общее описание:");
                    Сообщить(Парсер.Значение);
                КонецЕсли;
            КонецЕсли;
        ИначеЕсли Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            СтекИмен.Удалить(СтекИмен.Количество() - 1);
        КонецЕсли;
    КонецЦикла;
 
    Парсер.Закрыть();
 
КонецПроцедуры
 
/// Как записать данные в файл формата XML в 1с 8.3, 8.2
 
&НаКлиенте
Процедура ЗаписатьДанныеВФорматеXML(ПутьКФайлуДляЗаписи)
 
    // Предположим, что у нас есть данные о странах,
    // которые нужно записать во внешний файл в формате XML.    
 
    Страны = СоздатьДанныеДляЗаписиВXML();    
 
    // И эти данные хранятся во списке значений Страны,
    // который нам вернула внутренняя процедура (определена
    // ниже).
 
    ЗаписьXML = Новый ЗаписьXML;
 
    ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
 
    ЗаписьXML.ЗаписатьОбъявлениеXML();    
 
    ЗаписьXML.ЗаписатьНачалоЭлемента("Страны");
 
    Для Каждого Страна Из Страны Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("Страна");
        ЗаписьXML.ЗаписатьАтрибут("Название", Страна.Значение.Название);
        ЗаписьXML.ЗаписатьАтрибут("Численность", Страна.Значение.Численность);
        ЗаписьXML.ЗаписатьАтрибут("Столица", Страна.Значение.Столица);
 
        ЗаписьXML.ЗаписатьНачалоЭлемента("ТрадиционныеБлюда");
        Для Каждого Блюдо Из Страна.Значение.ТрадиционныеБлюда Цикл
            ЗаписьXML.ЗаписатьНачалоЭлемента("Блюдо");
            ЗаписьXML.ЗаписатьАтрибут("Название", Блюдо.Значение.Название);
            ЗаписьXML.ЗаписатьКонецЭлемента(); // Блюдо
        КонецЦикла;
        ЗаписьXML.ЗаписатьКонецЭлемента(); // ТрадиционныеБлюда
 
        ЗаписьXML.ЗаписатьНачалоЭлемента("ОбщееОписание");
        ЗаписьXML.ЗаписатьТекст(Страна.Значение.ОбщееОписание);
        ЗаписьXML.ЗаписатьКонецЭлемента(); // ОбщееОписание
 
        ЗаписьXML.ЗаписатьКонецЭлемента(); // Страна
    КонецЦикла;
 
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Страны
 
    ЗаписьXML.Закрыть();
 
КонецПроцедуры
 
&НаКлиенте
Функция СоздатьДанныеДляЗаписиВXML()
 
    Страны = Новый СписокЗначений;
 
    Россия = Новый Структура("Название, Численность, Столица, ТрадиционныеБлюда, ОбщееОписание");
    Россия.Название = "Россия";
    Россия.Численность = "144000000";
    Россия.Столица = "Москва";
    Россия.ТрадиционныеБлюда = Новый СписокЗначений;
    Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Щи"));
    Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Солянка"));
    Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Рассольник"));
    Россия.ОбщееОписание = "Страна с очень" + Символы.ПС + "большой территорией";    
    Страны.Добавить(Россия);
 
    Китай = Новый Структура("Название, Численность, Столица, ТрадиционныеБлюда, ОбщееОписание");
    Китай.Название = "Китай";
    Китай.Численность = "1357000000";
    Китай.Столица = "Пекин";
    Китай.ТрадиционныеБлюда = Новый СписокЗначений;
    Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Свинина в кисло-сладком соусе"));
    Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Курица гунбао"));
    Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Мапо тофу"));
    Китай.ОбщееОписание = "Страна с очень" + Символы.ПС + "большим населением.";
    Страны.Добавить(Китай);
 
    Возврат Страны;
 
КонецФункции
 
&НаСервере
Функция ПостроитьПуть(СтекИмен)
    Путь = "";
 
    Для Каждого Имя Из СтекИмен Цикл
        Путь = Путь + "/" + Имя;
    КонецЦикла;
 
    Возврат Путь;
КонецФункции
 
/// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.xml, который используется в примерах ниже.

Чтение и запись XML в языке 1С 8.3, 8.2 (в примерах)

<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

С уважением, (преподаватель школы 1С программистов и разработчик обновлятора).



Владимир Милькин
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться: