Загрузка XML в дерево значений

Опубликовал Sergey Andreev (starik-2005) в раздел Обмен - Обмен через XML

Случайно наткнулся на статью с алгоритмом загрузки XML-строки в дерево значений и подумал, а не проще ли сделать это через механизм XDTO рекурсивно. На мой взгляд, решение получилось неплохое - даже атрибуты грузит..

Добрый всем день, ночь и прочие времена суток, когда 1С-ники читают данный сайт.

Иногда (может даже часто) нужно загрузить XML в дерево значений. Вот как можно это сделать через механизм XDTO:

Процедура ПоместитьВДерево(Текст)
	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(Текст);
	Об = ФабрикаXDTO.ПрочитатьXML(Чтение);
	
	Строка = Дерево.ПолучитьЭлементы().Добавить();
	Строка.Узел = "Корневой узел";
	ПрочитатьУзел(Об, Строка);
КонецПроцедуры

Процедура ПрочитатьУзел(Об, лДерево)
	Если ТипЗнч(Об) = Тип("СписокXDTO") Тогда 
		Для Каждого Ст ИЗ Об Цикл
			Строка = лДерево.ПолучитьЭлементы().Добавить();
			Строка.Узел = Об.ВладеющееСвойство;
			Если ТипЗнч(Ст) = Тип("СписокXDTO") ИЛИ ТипЗнч(Ст) = Тип("ОбъектXDTO") Тогда
				ПрочитатьУзел(Ст, Строка);
			Иначе
				Строка.Элемент = Ст;
			КонецЕсли;
		КонецЦикла;
	Иначе
		Для Каждого Ст ИЗ Об.Свойства() Цикл
			Строка = лДерево.ПолучитьЭлементы().Добавить();
			Строка.Узел = Ст.Имя;
			Если ТипЗнч(Об[Ст.Имя]) = Тип("СписокXDTO") ИЛИ ТипЗнч(Об[Ст.Имя]) = Тип("ОбъектXDTO") Тогда
				ПрочитатьУзел(Об[Ст.Имя], Строка);
			Иначе
				Строка.Элемент = Об[Ст.Имя];
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

В данном случае у нас на управляемой форме есть дерево с двумя строковыми колонками "Узел" и "Значение". В процедуру "ПоместитьВДерево" нужно передать текст прочитанного XML-файла, после чего оный загрузится в дерево значений.

Скачать файлы

Наименование Файл Версия Размер
ЗагрузитьВДерево.epf
.epf 6,79Kb
17.11.16
14
.epf 6,79Kb 14 Скачать

См. также

Комментарии
1. Сергей Ожерельев (Поручик) 3491 19.11.16 17:23 Сейчас в теме
Довольно просто для клиента. На сервере будет работать? Ведь строго говоря, вы читаете XML не в дерево значений, а в реквизит формы ДанныеФормыДерево
2. Sergey Andreev (starik-2005) 852 19.11.16 23:07 Сейчас в теме
Это серверные процедуры. Просто в дерево тоже можно прочитать немного изменив код.
3. Андрей Карпов (karpik666) 361 22.11.16 17:23 Сейчас в теме
(2) starik-2005, может они и серверные, но явно в коде используется данныеФормыДерево, а не дерево значений, поэтому ваш код будет работать только в контексте вызываемой формы, но не в общем модуле.
4. Sergey Andreev (starik-2005) 852 22.11.16 20:07 Сейчас в теме
(3) karpik666, ну это чтобы у читателей была возможность подумать. Я за светлое коммунистическое будущее мыслителей и творцов, а не за общество потребительского кредитования...
5. Геннадий Николаев (genayo) 23.11.16 08:19 Сейчас в теме
Вот такой XML, не загружаются значения, только атрибуты:

<Table:Record name="CustPickingExportDC" row="1">
<Table:Field name="SalesId">ФН000000053</Table:Field>
<Table:Field name="PickingListId">ФН000000053</Table:Field>
<Table:Field name="CustAccount">000000661</Table:Field>
<Table:Field name="ConsigneeAccount">000000755</Table:Field>
<Table:Field name="InventLocationId"/>
<Table:Field name="DeliveryDate">2016-11-23</Table:Field>
<Table:Field name="ManDate"/>
<Table:Field name="ItemId">ББ00065B125</Table:Field>
<Table:Field name="InventQty">3</Table:Field>
<Table:Field name="SalesUnit">кг</Table:Field>
<Table:Field name="SalesQty">18</Table:Field>
</Table:Record>
6. Sergey Andreev (starik-2005) 852 23.11.16 11:14 Сейчас в теме
(5) genayo, да, при наличии "Namespace prefix" файл не грузится. Но если его убрать, то все работает:

Также заметил, что при наличии атрибутов у элемента и значение элемента - строка, а не вложенный контейнер, то я не нашел, как получить текст самого элемента у XDTO.
Прикрепленные файлы:
7. cartograph cartograph (cartograph) 23.11.16 11:42 Сейчас в теме
8. Sergey Andreev (starik-2005) 852 23.11.16 12:13 Сейчас в теме
(7) cartograph, ну там просто чтение, а тут в дерево раскладывает прочитанное рекурсивненько. Не чувствуете разницу?
9. Пользователь Инфостарта (infostart user) 14 23.11.16 12:29 Сейчас в теме
рекурсия, вложенные циклы - есть куда оптимизировать. кажись уже такие штуки на инфостарте не раз публиковали
10. Sergey Andreev (starik-2005) 852 23.11.16 13:05 Сейчас в теме
(9) infostart user, в данном конкретном случае оптимизировать, поверьте, особо некуда - вложенные циклы тут как раз уместны. А рекурсия - это вообще один из немногих способов организовать цикл в функциональном программировании, хотя, конечно, 1С тут в плане функциональности весьма ограничена.

Но если Вы предложите вариант оптимизации - велкам! ))
11. Геннадий Николаев (genayo) 23.11.16 13:37 Сейчас в теме
(6) Вот и я не нашел как чисто через фабрику XDTO такой XML прочитать, пришлось использовать комбинацию XDTO и DOM, что на больших файлах несколько печально. Может, есть идеи как проще такой XML прочитать?
12. Sergey Andreev (starik-2005) 852 28.11.16 22:16 Сейчас в теме
(11) как показал гугл, такая возможность есть. Видел в паре источников - сейчас не вспомню, в каких.