Алгоритм преобразования 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    3238    stopa85    12    

38

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

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

19.10.2023    7654    user1959478    52    

36

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

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3174    maksa2005    8    

26

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

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

1 стартмани

09.06.2023    10945    7    SpaceOfMyHead    18    

61

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

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4428    RustIG    9    

25

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

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

23.11.2022    3595    gzharkoj    14    

25

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

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

1 стартмани

21.03.2022    9053    7    kalyaka    11    

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


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