В самом общем виде информация в xml файле представлена следующим образом.
<ИмяПоля атрибут1=”…” атрибут2=”…”> ЗначениеПоля.
Будем называть полями xml документа, как имя поля, так и имя атрибута. Цель состоит в том ,чтобы обойти все записи в xml файле и вернуть список его полей. Для решения данной задачи воспользуемся объектами, с помощью которых организована работа с объектной моделью документов (DOM). Кроме этого применим такой мощный механизм как рекурсия. И так первый шаг, чтение xml файла и формирование объекта типа ДокументDOM.
стек=новый массив; чтение=Новый ЧтениеXML ; чтение.ОткрытьФайл(сокрЛП(вхИмяФайла)); мДокументДОМ=мДОМ.Прочитать(чтение);
Следующее, что мы должны сделать – это обойти все записи в xml файле.Для этого воспользуемся таким объектом как ОбходДереваDOM.
мФильтр=новый ФильтрУзловDOM(, ПараметрыОтбораУзловDOM.ОтображатьЭлемент, ПараметрыОтбораУзловDOM.ОтображатьАтрибут, , , , , ПараметрыОтбораУзловDOM.ОтображатьИнструкциюОбработки,,,,); мОбходДерева=новый ОбходДереваDOM(мДокументДОМ,мРодитель,мФильтр); тУзел=мОбходДерева.NextNode(); РекурсияXML(мОбходДерева,стек,мДокументДОМ);
Приведенный фрагмент заканчивается вызовом рекурсивной функции. Вот ее текст.
Функция РекурсияXML(вхОбход,выхДЗ,вхДокумент) тУзел=вхОбход.ТекущийУзел; если тУзел=Неопределено тогда возврат Ложь; конецесли; мФильтр=новый ФильтрУзловDOM(, ПараметрыОтбораУзловDOM.ОтображатьЭлемент, ПараметрыОтбораУзловDOM.ОтображатьАтрибут, ПараметрыОтбораУзловDOM.ОтображатьИнструкциюОбработки,,,,); пока тУзел<>неопределено цикл попытка мИмя=тУзел.ИмяЭлемента; если выхДЗ.Найти(мИмя)=Неопределено тогда ; выхДЗ.Добавить(мИмя); конецесли; для каждого атрибут из тУзел.Атрибуты цикл мИмя=атрибут.Имя; если выхДЗ.Найти(мИмя)=Неопределено тогда выхДЗ.Добавить(мИмя); конецесли; конеццикла; исключение сообщить(ОписаниеОшибки()); конецпопытки; мВложенноеДерево=новый ОбходДереваDOM(вхДокумент,тУзел,мФильтр); Если мВложенноеДерево.FirstChild()<>Неопределено тогда РекурсияXML(мВложенноеДерево,приемник,вхДокумент); конецесли; тУзел=вхОбход.NextSibling(); конеццикла; возврат Истина; КонецФункции
На что надо обратить внимание в приведенном коде? Это то, что обход организован по двум уровням соседним (Sibling) узлам, и вложенным (Child). Изложенный механизм реализован в обработке Переходник, краткое описание, которой можно найти здесь (http://www.youtube.com/watch?v=Rdz_TTr3qGM)