Разбор XML в 1С с помощью механизма XDTO

XML

Механизм XDTO (XML Data Transfer Objects) собственная разработка 1С, который появился с выходом платформы 8.1. Это очень мощный инструмент, а удобный разбор XML лишь малая часть того, что он может. В рамках этой статьи останавливаться подробно на самом механизме не буду.

Кроме использования XDTO существует множество способов парсинга XML файлов в 1С — от простого последовательного перебора текста, до использования внешних dll библиотек. Вот некоторые преимущества при использования для этой задачи именно этого механизм:

  • Быстродействие — конвертация файла в ОбъектXDTO проходит сравнительно быстро. Стоит отметить, что время выполнения зависит от объема данных линейно.
  • Удобно программировать — тремя строчками кода, мы получаем готовый ОбъектXDTO из любого xml, с которым очень удобно работать используя синтаксис 1С «через точку».
  • В случае наличия xsd-схемы можно на ходу проверять соответствие файла схеме.

Ниже примеры кода.

Для получения ОбъектXDTO достаточно вызвать метод ПрочитатьXML глобальной ФабрикиXDTO

Код с оформлением
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл(ФайлXML, ,);
ОбъектXDTOизФайла = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

Далее работаем с атрибутами, свойствами и текстом XML.
Свойства и атрибуты можно прочитать методом Свойства() ОбъектаXDTO:

Код с оформлением
//атрибуты и свойства 
Для Каждого Св Из ОбъектXDTO.Свойства() Цикл
	Если Св.Форма = ФормаXML.Атрибут Тогда
		Ключ=Св.Имя;
		Значение = ОбъектXDTO.Получить(Св);
	КонецЕсли;
КонецЦикла;

Текст и свойства XML получаем через Последовательность():

Код с оформлением
Последовательность = ОбъектXDTO.Последовательность();
КолвоЭлементов = Последовательность.Количество(); 
Если КолвоЭлементов = 0 Тогда
	//у объекта только атрибуты
	Возврат;
КонецЕсли; 
	
Для Индекс=0 По КолвоЭлементов1 Цикл		
	Свойство = Последовательность.ПолучитьСвойство(Индекс);
		
	Если Свойство = Неопределено Тогда
		//это текст
		Значение = Последовательность.ПолучитьТекст(Индекс);		
	Иначе
		Значение = Последовательность.ПолучитьЗначение(Индекс);
	КонецЕсли;
		
КонецЦикла; 		

Обработка с примером конвертации данных из XML в дерево значений в приложении: