Поиск по документу XML
Для поиска по документу XML используется язык запросов XPath. Язык позволяет осуществлять навигацию по древовидной структуре XML-документа, указывая путь к искомому узлу.
«1С:Шина» позволяет использовать все стандартные средства поиска с использованием XPath
. Для этого в «Шине» предоставлены специальные типы встроенного языка:
ПоискXPath — основной тип для поиска по документу XML с помощью XPath
. В качестве аргумента принимает ВыражениеXPath — путь к искомому узлу. Для выражения можно указать соответствие префиксов и пространств имен, используемых в документе XML. Для поиска можно использовать параметры. Для типа ПоискXPath
доступны различные методы, например Найти, который осуществляет поиск всех узлов по указанному выражению, или НайтиПервый, который выполняет поиск до первого найденного узла.
Также доступен потоковый поиск по документу XML. Данный вариант является менее ресурсоемким, но имеет ограничения в синтаксисе.
Пример
Для следующего документа в формате XML:
<?xml version="1.0" encoding="UTF-8"?>
<Серверы>
<Сервер URL="localhost:9090">
<Проекты>
<Проект Название="Проект Демо CRM">
<Приложение Название="Демо CRM" Сборка="1.0"/>
<Приложение Название="Демонстрационное приложение" Сборка="1.0"/>
<Приложение Название="Демонстрационное приложение" Сборка="1.1"/>
</Проект>
<Проект Название="Проект приложения с разделами">
<Приложение Название="Стандартное приложение" Сборка="1.0"/>
<Приложение Название="1С:Кабинет сотрудника" Сборка="2.0"/>
</Проект>
</Проекты>
</Сервер>
</Серверы>
так может выглядеть выражение запроса на языке XPath
, которое выполняет поиск элементов Проект
со значением атрибута Название
, равное Проект Демо CRM
, и его дочернего элемента Приложение
с названием Демо CRM
:
/Серверы/Се рвер/Проекты/Проект[@Название = 'Проект Демо CRM']/Приложение[@Название = 'Демо CRM']
где через /
указываются элементы, в []
после @
указывается атрибут, а в ''
— его значение.
Использование параметров в выражении XPath
Если выражение XPath
может быть повторно использовано с разными значениями в методе или условии, то вместо создания нового объекта типа ПоискXPath
рекомендуется использовать параметры. Для этого вместо константного значения нужно использовать \$ + имя параметра
для подстановки (например, \$p1
). В таком случае выражения /root/row[@attr = 'a']
, /root/row[@attr = 'b']
, /root/row[@attr = 'c']
могут быть заменены на одно выражение /root/row[@attr = \$p1]
, где перед каждым вызовом метода поиска можно установить значение параметра p1
.
Потоковый поиск по документу XML
Для поиска по документу XML рекомендуется использовать метод СледующийПоВыражениюXPath типа ЧтениеXml. Данный способ выполняется потоково, что требует значительно меньших вычислительных ресурсов, особенно для документов XML большого размера. Для построения выражения поиска по потоку документа XML использует ся отдельный тип ВыражениеXPathЧтенияXml.
Метод СледующийПоВыражениюXPath
читает узлы до тех пор, пока не встретит узел, соответствующий поиску по заданному выражению XPath
. Возвращает Истина
, если текущий узел является искомым, иначе Ложь
(текст XML завершился).
XPath
для потоковой обработки имеет следующие возможности и ограничения:
- однонаправленный поиск от начала документа
- поддержка осей
child
(ось по умолчанию,child::elem
→elem
)descendant
(//
)attribute
(@
)namespace
- условия
- только атрибуты контекстного элемента
- только оператор
and
- для контекстного элемента не допускается цепочка условий (например, нельзя
//elem[@attr='1'][@attr2='2']
) - операторы сравнения
=
,!=
,<
,<=
,>
,>=
- для
<
,<=
,>
,>=
выполняется неявное приведение к числу
- для
- если оператор не указан, то выполняется проверка на наличие значения атрибута
- функции проверки значения на вхождение подстроки (есть зависимость от регистра)
contains
starts-with
ends-with
- нельзя использовать
wildcard
(*
) - нельзя использовать параметры
- можно использовать интерполяцию для построения строки выражения
Примеры:
/root/elem
/root/elem[@attr = 'a' and @attr2 = 'c']/elem[@attr = 'b']
//elem/elem
//elem[@attr = 'a']/elem[@attr = 'b']
//elem[@attr]
//elem[contains(@attr, 'b')]
//elem[starts-with(@attr, 'a')]
//elem[ends-with(@attr, 'z')]