Книга знаний

1С:Предприятие / Приемы программирования / Обмен данными, УРБД

Применение XSL запросов при организации доступа к данным XML файла из 1С (7.7+V7plus.dll)

В статье дается краткое описание XSL запросов к XML файлам, с примерами. В приложении присутствует обработка, с помощью которой можно проверить разные XSL запросы к любому XML файлуАвтор статьи: Паладин | Редакторы:
Последняя редакция №3 от 12.09.06 | История
URL: http://kb.mista.ru/article.php?id=364

Ключевые слова: XSL, XML, обмен данными


Появление стандарта обмена информации в XML также привело к тому, что появи-лась необходимость в механизмах запроса к XML с целью обработки выбранной инфор-мации, сортировки и фильтрации. Это имеет большое значение при написании универ-сальных обработок обмена данными в 1С.
У меня возникла необходимость произвести выборку определенных узлов в XML файле по разным условиям, также было интересно последовательно перебрать весь доку-мент по узлам. Та информация, которая находится в Синтаксис-помощнике, не сильно прояснила ситуацию. Единственное что стало ясно, что запросы составляются в XSL. Часть этого языка, предназначенного для выполнения запросов, называют XML Path Language (XPath) и XML Query Language (XQL). О тех языковых конструкциях XSL, ко-торые можно применять при выборке информации из XML файла и пойдет разговор в этой статье.

Структура запроса XSL
Запрос осуществляется методом ВыбратьУзлы() или ВыбратьУзел(). Первый воз-вращает коллекцию из всех узлов, удовлетворяющим строке запроса, второй возвращает только один узел. Запрос осуществляется к определенному узлу. В нашем примере мы де-лаем запрос к корневому элементу документа – элементу «Данные».
Запрос имеет определенный путь: абсолютный и относительный
Если запрос начинается с точки (сокращенное от self::node()) – то он делает выборку относительно текущего узла.
./ (сокращенное от child::) - поиск осуществляется в текущем контексте и только на первом уровне подчинения
Данные.ВыбратьУзлы("./СправочникЭлемент")
В выборке Данные будут содержатся узлы с наименованием СправочникЭлемент, причем обработан будет только первый уровень подчиненных элементов (если в Узел Данные входит узел СправочникГруппа, то элементы подчиненные СправочникГруппа выбраны не будут)
.// (сокращенное от descendant::)- поиск осуществляется в выбранном узле, включая все подчиненные элементы.
Данные.ВыбратьУзлы(".//СправочникЭлемент")
В выборке Данные будут содержатся узлы с наименованием СправочникЭлемент, причем обработаны будут все уровни подчинения. (если в Узел Данные входит узел Спра-вочникГруппа, то элементы подчиненные СправочникГруппа также будут в выборке)
*-  при использовании этого символа в выборку включаются все узлы, подчинен-ные текущему узлу. Данные.ВыбратьУзлы(".//*"); - вернет коллекцию всех элементов на всех уровнях, подчиненную узлу Данные.  Данные.ВыбратьУзлы("./*");- вернет коллек-цию всех элементов только на 1 уровне подчинения узлу Данные.  

Если запрос начинается с «..» (сокращенное от parent::node()) то выборка произво-дится начиная с родителя текущего узла.
Если в начале запроса перед символами «/» и «//» нет точки, то в запрос будут вхо-дить элементы начиная с корневого узла.
/ - поиск осуществляется в корневом узле только на первом уровне подчинения
пример: Данные.ВыбратьУзлы("/СправочникЭлемент")
// (сокращенное от /descendant-or-self::node()/) - в выборке будут участвовать все эле-менты документа, включая корневой, например
Данные.ВыбратьУзлы("//СправочникЭлемент").

Можно делать поиск узлов аналогично как мы обращаемся к папкам и файлам на компьютере. Например, запрос .//СправочникГруппа/СправочникЭлемент вернет коллек-цию узлов с именем тега «СправочникЭлемент», находящихся в узле «СправочникГруп-па».

Часто необходимо выбрать элемент по значению определенного атрибута. Тогда помимо конструкции выбора узла добавляется [@имяАтрибута=определЗнач]
@ - сокращенное от attribute::, служит для поиска атрибута узла

.//СправочникГруппа[@Код="1"] – выбор всех элементов подчиненных текущему, имеющих наименование «СправочникГруппа» и атрибут Код=1.
./*[@ Атрибут] – поиск всех узлов текущего уровня с атрибутом «Атрибут»
.//*[@ Атрибут] – поиск всех узлов с атрибутом «Атрибут»
.//*[@Атрибут=”1”] – поиск всех узлов с атрибутом «Атрибут» равным 1

РодительКод=123;
Тег=Данные.ВыбратьУзлы(".//СправочникГруппа[@Код="+РодительКод+"]");
В результате в переменной «Тег» будет содержаться выборка нужных нам узлов, которая удовлетворяет критерию запроса. Поиск проводится по всем узлам потомкам кор-невого узла Данные включая сам корневой элемент.

Обработка выборки узлов
Любая полученная выборка узлов обрабатывается следующим образом

Для х=0 по Выборка.КоличествоУзлов()-1 Цикл
   …………..
СправочникЭлемент =Выборка.ПолучитьУзел(х);
…………...
КонецЦикла;

Перебор коллекции узлов делается согласно документации, с 0 по количествоУз-лов()-1.

Если возникла необходимость проанализировать входящие в узлы атрибуты, то не-обходимо расширить нашу конструкцию:
Атрибут=СоздатьОбъект(“СписокЗначений”);
Для х=0 по Выборка.КоличествоУзлов()-1 Цикл
   …………..
СправочникЭлемент =Выборка.ПолучитьУзел(х); //- позиционируемся на
//узле справочника
       Для у=1 по СправочникЭлемент.КоличествоАтрибутов() Цикл
Атрибут .ДобавитьЗначение(СправочникЭлемент.ПолучитьУзелАтрибута(у).Значение);
   //Атрибут – список значений реквизитов
       КонецЦикла;
…………...
КонецЦикла;

Перебор атрибутов нужно делать именно с 1 а не с 0, т.к. у меня появлялась ошибка при попытке получить узел атрибута с номером «0».

Функции при выборе узлов
last() – выбор последнего элемента. СправочникГруппа[last()] – выбор последнего узла СправочникГруппа в соответсвии с условиями поиска
position() – возвращает текущий номер выбираемого узла. Используется для усло-вий выбора. СправочникГруппа[position()>5] – будет произведен выбор узлов с 5 и далее. Также если использовать эту функцию дополнительно к определенному условию
.//СправочникГруппа[@Код="1"] [position()=5] – будет произведен выбор 5-ого элемента с наименование СправочникГруппа атрибутом Код=1



Была предпринята попытка рассмотреть основные XSL запросы к XML файлам. Полная  информация по данной теме содержится в следующих ресурсах (на английском)
http://www.w3.org/TR/1999/REC-xpath-19991116
http://www.w3.org/TandS/QL/QL98/pp/xql.html
В приложении есть ХМЛ файл как образец, а также простая обработка, на примере которой можно посмотреть, какие результаты получаются при формировании различных запросов (все запросы в этой обработке выполняются для корневого элемента «Данные»)

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика