Однаждый Джоель Мозес (англ. Joel Moses) сказал «APL как красивый бриллиант — безупречный, симметричный. Но вы ничего не можете к нему добавить. Если вы попытаетесь приклеить к нему другой алмаз — вы не получите бóльший алмаз. Лисп же — это ком грязи. Добавь еще и он останется комом грязи — он все еще будет выглядеть как Лисп.» Для меня, кроме лиспа, таким комом грязи стал XML. На протяжении долгого времени на эти значки < и > натягивают все больше и больше семантики. Появляются страшные слова - DTD, xsd, xslt, RDF .... Сегодня уже вовсю идет подготовка к Xforms, и кто знает что еще прикрутят к этому формату завтра? Кассанрой работать всегда тяжело, но одно знаю точно — XML останется XML — заголовок и корневой элемент, открывающие и закрывающие тэги, текстовое представление — останется всегда. А раз так — то вечным будет вопрос — как прочитать XML и работать с ним?
Многие пишут свои универсальные функции которые разбирают XML в дерево, в таблицу значений, в массив или как в этой заметке — в структуру. У всех этих способов есть свои плюсы и минусы.
Плюсы подхода изложенного в этой заметке — типизация полученного результата.
Минусы — время работы, объем потребляемой памяти. Поэтому для чтения больших файлов (более 5 kb) слабо подходит.
Для примера используется такое определение XSD
и вот такой xml для теста
Код для преобразования -
Функция xdto2struct(XDTO)
структураОбъекта = новый Структура;
Для каждого х Из XDTO.свойства() Цикл
Попытка
// пусть так определяется что это список. Может и лучше можно, не знаю.
ПрочитаноеЗначение= XDTO.ПолучитьСписок(х);
Исключение
ПрочитаноеЗначение= XDTO.Получить(х);
КонецПопытки;
типЭлемента = типЗнч(ПрочитаноеЗначение);
если типЭлемента = тип("ОбъектXDTO") тогда
структураОбъекта.Вставить(х.Имя,xdto2struct(ПрочитаноеЗначение));
иначеесли типЭлемента = тип("СписокXDTO") тогда
структураОбъекта.Вставить(х.Имя, list2array(ПрочитаноеЗначение));
иначе
/// простое значение
структураОбъекта.Вставить(х.Имя,ПрочитаноеЗначение);
КонецЕсли;
КонецЦикла;
Возврат структураОбъекта;
КонецФункции
функция list2array(listXdto)
массивВозврата = новый Массив;
для каждого у из listXdto цикл
массивВозврата.Добавить(новый Структура("Тип,Значение",ТипВСтруктуру(у.тип()),xdto2struct(у)));
конецЦикла;
возврат массивВозврата;
КонецФункции
Функция ТипВСтруктуру(типРазбора)
Возврат Новый Структура("URI,имя",типРазбора.URIПространстваИмен ,типРазбора.Имя);
КонецФункции
При помощи этого кода легко и быстро можно превратить входящий xml в структуру и затем уже работать с ней в своем приложении.
Вот так будет выглядеть корневой элемент
На этом скриншоте - элементы массива (кстати, если XML - простой (нет пересекающихся имен типов) можно легко отказаться от описания типа)
Так выглядит загруженный элемент one (обратите внимание что тэг age - уже приведен к числу, согласно схемы)
В обработке прикрепленной к заметке — тот же самый код (плюс несколько несложных сервисных функций)