Преобразование XML файла в переменную структура, Загрузка в дерево значений




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

Возникала необходимость чтения  обработки XML файлов неизвестной структуры, вот написал процедуры, которые преобразуют XML файл любой в дерево значений, а также считывают и преобразуют данные в переменную типа структура причем типы переменных преобразуются в соответствии с требованиями, Дата, Булево, Число, Строка

 

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

 

Возможно, что кому нибудь эти данные будут интересны

Тестировалась на платформе 1С:Предприятие 8.3 (8.3.15).

Конфигурация 1С не имеет значения.

18 Comments

  1. nporrep

    В типовых, xml2деревоЗначений:

    СтрокаXML= ОбменСКонтрагентамиСлужебный.ПрочитатьТекстИзФайла(ИмяФайла, , Истина);
    ДеревоXML = ОбменСКонтрагентамиСлужебный.ЗагрузитьСтрокуXMLВДеревоЗначений(СтрокаXML);
    
    Reply
  2. vik070777

    Дерево значений это хорошо, но у меня основная цель стояла создать переменную структуры а не дерево значений, а так спасибо!

    Reply
  3. oleganatolievich

    (2) создание структуры тоже есть. плохо искали

    Reply
  4. oleganatolievich

    модуль ИнтеграцияВЕТИС, 1С:ERP Управление предприятием 2 (2.4.9.82)

    // Преобразует объект XDTO в структуру

    //

    // Параметры:

    // ОбъектXDTO — ОбъектXDTO — Объект XDTO.

    //

    // Возвращаемое значение:

    // Структура — Структура объекта.

    //

    Функция ОбъектXDTOВСтруктуру(ОбъектXDTO, ПараметрыПреобразования = Неопределено) Экспорт

    Структура = Новый Структура;

    ТипОбъектаXDTO = ОбъектXDTO.Тип();

    Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл

    ИмяСвойства = Свойство.Имя;

    ЗначениеСвойства = ОбъектXDTO[ИмяСвойства];

    Если ТипЗнч(ЗначениеСвойства) = Тип(«ОбъектXDTO») Тогда

    Структура.Вставить(ИмяСвойства, ОбъектXDTOВСтруктуру(ЗначениеСвойства, ПараметрыПреобразования));

    ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип(«СписокXDTO») Тогда

    Структура.Вставить(ИмяСвойства, Новый Массив);

    Для Индекс = 0 По ЗначениеСвойства.Количество() — 1 Цикл

    ЭлементСписка = ЗначениеСвойства.Получить(Индекс);

    Если ТипЗнч(ЭлементСписка) = Тип(«ОбъектXDTO») Тогда

    Структура[ИмяСвойства].Добавить(ОбъектXDTOВСтруктуру(ЭлементСписка, ПараметрыПреобразования));

    Иначе

    Структура[ИмяСвойства].Добавить(ЭлементСписка);

    КонецЕсли;

    КонецЦикла;

    Иначе

    Структура.Вставить(ИмяСвойства, ЗначениеСвойства);

    Если ПараметрыПреобразования <> Неопределено

    И ПараметрыПреобразования.НайтиИдентификаторы

    И Свойство.Тип = ПараметрыПреобразования.ТипUUID Тогда

    РезультатПоиска = ПараметрыПреобразования.ТипыИдентификаторов[ТипОбъектаXDTO];

    Если РезультатПоиска <> Неопределено

    И РезультатПоиска.ИмяПоля = ИмяСвойства Тогда

    ПараметрыПреобразования.Идентификаторы[РезультатПоиска.ИмяТаблицы].Вставить(ЗначениеСвойства, РезультатПоиска.ПустоеЗначение);

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

    Возврат Структура;

    КонецФункции

    Reply
  5. vik070777

    Спасибо, бывает))))

    Reply
  6. starik-2005

    Где-то я это уже видел (даже имена переменных аналогичные) ))))

    https://infostart.ru/public/562346/

    Reply
  7. vik070777

    Увы не брал оттуда, тем более у меня перевод в структуру , и вывод в макет не дерева а структуру в группировке

    Reply
  8. Yashazz

    (6) да всё это баяны чудовищные, самоочевидность же и элементарно всё

    Reply
  9. Yashazz

    Я такое ещё в 2007 году делал)

    А вот интересно, озаботился ли кто-нибудь xslt-преобразованием между хмл и джейсоном, туда и обратно? Тогда можно будет сериализацию и преобразование гонять более просто)

    Reply
  10. John_d

    (2) Если интересно преобразую из произвольного шаблона в виде дерева значения в xml.

    https://infostart.ru/public/964582/

    Reply
  11. starik-2005

    (9)

    Я такое ещё в 2007 году делал)

    Ну вряд ли через XDTO, а в дерево на паскале я такое еще в 1997 делал )))

    Reply
  12. Yashazz

    (11)

    Ну вряд ли через XDTO, а в дерево на паскале я такое еще в 1997 делал )))

    Если склероз не изменяет, то на XDTO делал тоже. А насчёт паскаля — ну да, 1995 год, Турбо-Паскаль 5.0, золотая юность)

    Reply
  13. starik-2005

    (12)

    1995 год, Турбо-Паскаль 5.0

    Это ж уровень 7.7 в 2019-м (ну может быть 8.0) — никакого ООП. Борланд Паскаль 7.0 вышел, если мне не изменяет память, в 92-м. На нем уже по RTM PM 286 можно было писать, была доступна вся память, но адресов переменных можно было выделить только 2#k8SjZc9Dxk16.

    Reply
  14. vik070777

    Вы еще Basic вспомните я на нем в начале 90х прогу писал для склада ИСКРА 1030м была 086

    Reply
  15. vik070777

    (13)

    Вы еще Basic вспомните я на нем в начале 90х прогу писал для склада ИСКРА 1030м была 086

    Reply
  16. Yashazz

    (13) Первая ООП появилась в 5.5, а нормальная да, в 7.0, но уж не будем оффтопить)

    Reply
  17. Aleksey81

    Вероятно вы должны были написать еще текст функции _ПолучитьВТипеДанногоЭлемента

    Функция _ПолучитьВТипеДанногоЭлемента(Значение)
    
    Если ВРЕГ(СокрЛП(Значение)) = «ДА»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «ОК»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «YES»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «ИСТИНА»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «TRUE» ТОгда
    Возврат Истина;
    ИначеЕсли ВРЕГ(СокрЛП(Значение)) = «НЕТ»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «ОТМЕНА»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «NO»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «ЛОЖЬ»
    ИЛИ ВРЕГ(СокрЛП(Значение)) = «FALSE» ТОгда
    Возврат ЛОЖЬ;
    КонецЕсли;
    Попытка
    _Значение = стрЗаменить(Значение,»,»,».»);
    _Значение = стрЗаменить(_Значение,»-«,».»);
    Число = Число(Значение);
    Возврат Число;
    Исключение
    КонецПопытки;
    Попытка
    _Дата = xmlЗначение(тип(«дата»), Значение);
    Возврат _Дата;
    Исключение
    КонецПопытки;
    Возврат Значение;
    КонецФункции  //_ПолучитьВТипеДанногоЭлемента

    Показать

    Reply
  18. vik070777

    (17) Эта из обработки и есть, как бы вопрос преобразования типов понятен был, я старался именно структуру показать. А то что Вы вырезали процедуру и вставили сюда, ну спасибо ))))

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *