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

08.08.13

Разработка - Математика и алгоритмы

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

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

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

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

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1753    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4415    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7455    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7854    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4444    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8832    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7797    dusha0020    8    

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


Ну и рекурсивненько так организовать цикл. Нафига вечно городить огороды?
Оставьте свое сообщение