XML-файлы очень часто встречаются при обмене данными между различными программными продуктами, сайтами и т.п.
В 1С существует несколько методов чтения XML-файлов:
- последовательное чтение XML-файла;
- преобразование XML-файла в DOM-документ и чтение его узлов;
- чтение с использованием фабрики XTDO.
Для чтения относительно небольших файлов XML лично мне нравится второй способ — чтение через DOM-документ. Этот способ кажется мне наиболее простым, но стоит заметить, что на больших файлах (более 100 тысяч записей) он работает ощутимо медленнее.
Чтение XML-файла черед DOM-документ
Для примера возьмем упрощенный XML-файл, в котором с сайте передан заказ клиента. Лишние узлы оттуда убраны, но порядок чтения файла от этого не меняется.
По данным XML-файла будем создавать документ ЗаказПокупателя.
Источник=новый ЧтениеXML;
Источник.ОткрытьФайл(Объект.ЗаказыФайл); // в реквизите ЗаказыФайл находится путь к XML-файлу
Построитель=новый построительDOM;
Документ=Построитель.Прочитать(Источник);
Для каждого Элемент из Документ.ЭлементДокумента.ДочерниеУзлы Цикл // Файл содержит один основной узел. Перебираем сразу дочерние узлы (Документ)
Если Элемент.ИмяУзла="Документ" ТОгда
НовыйДокумент=Документы.ЗаказПокупателя.СоздатьДокумент();
Для каждого РеквизитДокумента Из Элемент.ДочерниеУзлы Цикл // перебираем реквизиты документы, являющиеся дочерними для узла Документ
Если РеквизитДокумента.ИмяУзла="Ид" Тогда
НовыйДокумент.Номер=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="Дата" Тогда
НовыйДокумент.Дата=XMLЗначение(Тип("Дата"), РеквизитДокумента.ТекстовоеСодержимое);
ИначеЕсли РеквизитДокумента.ИмяУзла="СуммаЗаказа" Тогда
НовыйДокумент.СуммаДокумента=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="ВалютаЗаказа" Тогда
НовыйДокумент.ВалютаДокумента=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="Товар" Тогда
Для каждого Товар из РеквизитДокумента.ДочерниеУзлы Цикл //обходим товары
новаяСтрока=НовыйДокумент.Товары.Добавить(); // если есть товар в заказе, добавим строку в таблицу
Для каждого РеквизитТовара из Товар.ДочерниеУзлы Цикл // заполняем строчку заказа
Если РеквизитТовара.ИмяУзла="Наименование" Тогда
НоваяСтрока.Номенклатура=РеквизитТовара.ТекстовоеСодержимое;
ИначеЕсли РеквизитТовара.ИмяУзла="Количество" Тогда
НоваяСтрока.Количество=РеквизитТовара.ТекстовоеСодержимое;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
Источник.ОткрытьФайл(Объект.ЗаказыФайл); // в реквизите ЗаказыФайл находится путь к XML-файлу
Построитель=новый построительDOM;
Документ=Построитель.Прочитать(Источник);
Для каждого Элемент из Документ.ЭлементДокумента.ДочерниеУзлы Цикл // Файл содержит один основной узел. Перебираем сразу дочерние узлы (Документ)
Если Элемент.ИмяУзла="Документ" ТОгда
НовыйДокумент=Документы.ЗаказПокупателя.СоздатьДокумент();
Для каждого РеквизитДокумента Из Элемент.ДочерниеУзлы Цикл // перебираем реквизиты документы, являющиеся дочерними для узла Документ
Если РеквизитДокумента.ИмяУзла="Ид" Тогда
НовыйДокумент.Номер=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="Дата" Тогда
НовыйДокумент.Дата=XMLЗначение(Тип("Дата"), РеквизитДокумента.ТекстовоеСодержимое);
ИначеЕсли РеквизитДокумента.ИмяУзла="СуммаЗаказа" Тогда
НовыйДокумент.СуммаДокумента=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="ВалютаЗаказа" Тогда
НовыйДокумент.ВалютаДокумента=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="Товар" Тогда
Для каждого Товар из РеквизитДокумента.ДочерниеУзлы Цикл //обходим товары
новаяСтрока=НовыйДокумент.Товары.Добавить(); // если есть товар в заказе, добавим строку в таблицу
Для каждого РеквизитТовара из Товар.ДочерниеУзлы Цикл // заполняем строчку заказа
Если РеквизитТовара.ИмяУзла="Наименование" Тогда
НоваяСтрока.Номенклатура=РеквизитТовара.ТекстовоеСодержимое;
ИначеЕсли РеквизитТовара.ИмяУзла="Количество" Тогда
НоваяСтрока.Количество=РеквизитТовара.ТекстовоеСодержимое;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;