gifts2017

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 19.11.16 17:23
Довольно просто для клиента. На сервере будет работать? Ведь строго говоря, вы читаете XML не в дерево значений, а в реквизит формы ДанныеФормыДерево
2. Sergey Andreev (starik-2005) 19.11.16 23:07
Это серверные процедуры. Просто в дерево тоже можно прочитать немного изменив код.
3. Андрей Карпов (karpik666) 22.11.16 17:23
(2) starik-2005, может они и серверные, но явно в коде используется данныеФормыДерево, а не дерево значений, поэтому ваш код будет работать только в контексте вызываемой формы, но не в общем модуле.
4. Sergey Andreev (starik-2005) 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) 23.11.16 11:14
(5) genayo, да, при наличии "Namespace prefix" файл не грузится. Но если его убрать, то все работает:

Также заметил, что при наличии атрибутов у элемента и значение элемента - строка, а не вложенный контейнер, то я не нашел, как получить текст самого элемента у XDTO.
Прикрепленные файлы:
7. cartograph cartograph (cartograph) 23.11.16 11:42
8. Sergey Andreev (starik-2005) 23.11.16 12:13
(7) cartograph, ну там просто чтение, а тут в дерево раскладывает прочитанное рекурсивненько. Не чувствуете разницу?
9. Пользователь Инфостарта (infostart user) 23.11.16 12:29
рекурсия, вложенные циклы - есть куда оптимизировать. кажись уже такие штуки на инфостарте не раз публиковали
10. Sergey Andreev (starik-2005) 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) 28.11.16 22:16
(11) как показал гугл, такая возможность есть. Видел в паре источников - сейчас не вспомню, в каких.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа