gifts2017

Алгоритм преобразования XML строки в дерево значений

Опубликовал Роман Неважно (Romeooo) в раздел Программирование - Практика программирования

Простой способ преобразования XML строки в дерево значений.
Кода меньше, чем в любом из вариантов, найденных мною в интернете.

Функция формирует из переданной в параметре XML строки дерево значений, которое возвращает в место вызова. Функцию можно расположить в любом модуле 1С.

Пример вызова функции _ДеревоЗначений =  ПолучитьДеревоЗначенийИзXMLСтроки(XMLСтрока);

Функция ПолучитьДеревоЗначенийИзXMLСтроки(XMLСтрока)
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(XMLСтрока);
	ЧтениеXML.Прочитать();
	РезультатДерево = Новый ДеревоЗначений;
	РезультатДерево.Колонки.Добавить("НазваниеУзла");
	РезультатДерево.Колонки.Добавить("ЗначениеУзла");
	МассивОткрытыхСтрок = Новый Массив;
	ПоследняяОткрытаяСтрока = Неопределено;
	Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда
Если МассивОткрытыхСтрок.Количество() Тогда
_Родитель = МассивОткрытыхСтрок[МассивОткрытыхСтрок.Количество()-1]; Иначе
_Родитель = РезультатДерево; КонецЕсли; ПоследняяОткрытаяСтрока = _Родитель.Строки.Добавить(); ПоследняяОткрытаяСтрока.НазваниеУзла = ЧтениеXML.Имя; МассивОткрытыхСтрок.Добавить(ПоследняяОткрытаяСтрока); ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.Текст Тогда
ПоследняяОткрытаяСтрока.ЗначениеУзла = ЧтениеXML.Значение; ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
Если МассивОткрытыхСтрок.Количество() Тогда
МассивОткрытыхСтрок.Удалить(МассивОткрытыхСтрок.Количество()-1); КонецЕсли; КонецЕсли; КонецЦикла; Возврат РезультатДерево; КонецФункции

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Осипов Сергей (fixin) 12.10.15 10:45
2. Maxim Kolkin (the1) 17.11.16 11:41
3. Sergey Andreev (starik-2005) 17.11.16 12:14
Чета многа коду. Я бы так как-нить сделал:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФала);
ОбъектХ = ФабрикаХДТО.ПрочитатьXML(Чтение);
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Узел", ОписаниеТипов("Строка"));
Дерево.Колонки.Добавить("Элемент", ОписаниеТипов("Строка"));
Для каждого Ст ИЗ ОбъектХ.Свойства() Цикл
  Строка = Дерево.Строки.Добавить();
     Строка.Узел = Ст.Имя;
     Строка.Элемент= ОбъектХ[Ст.Имя];
   Если ТипЗнч(Ст) = Тип("СписокXDTO") Тогда
      ЗагрузитьВСтрокиДерева(Строка, Ст);
  КонецЕсли;
КонецЦикла;
...Показать Скрыть


Ну и рекурсивненько так организовать цикл. Нафига вечно городить огороды?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа