Книга знаний

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

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

В статье дается краткое описание XSL запросов к XML файлам, с примерами. В приложении присутствует обработка, с помощью которой можно проверить разные XSL запросы к любому XML файлу. Работа с XML ведется с использованием компоненты V7plus.dll. Файлы, содержащие в себе тег xmlns - не обрабатываются этими запросами. Автор статьи: Паладин | Редакторы:
Последняя редакция №16 от 04.11.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
В приложении есть простая обработка, на примере которой можно посмотреть, какие результаты получаются при формировании различных запросов (все запросы в этой обработке выполняются для корневого элемента «Данные», в прочем пользователь может указать свой корневой элемент. Напомню, что корневой элемент - это первый и единственный узел непосредственно подчиненный документу. Все остальные узлы документа подчинены корневому элементу)
Обработка: http://paladin1c.mylivepage.ru/file/?fileid=862
Если есть необходимость написать статью по методам XML, применяемых в 1С (не только те, которые поддерживаются в V7Plus.dll) пишите на почту.

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

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