Перейти к основному содержимому

ПоискXPath

Стд::Xml::XPath::ПоискXPath

Объект для поиска XPath по документу XML.

Сравнение ссылочное

Иерархия типа

Базовые типы: Объект


Примеры

Исходная строка XML

<?xml version="1.0" encoding="UTF-8"?>
<ОстаткиТоваров xmlns="http://company/data/stock">
<Склад Код="M001">
<Товар Код="Т100" ЕИ="шт">
<Запас Вид="1" Количество="20.00"/>
<Запас Вид="2" Количество="80.00"/>
</Товар>
</Склад>
<Склад Код="M002">
<Товар Код="Т100" ЕИ="шт">
<Запас Вид="1" Количество="2.00"/>
<Запас Вид="2" Количество="10.00"/>
</Товар>
<Товар Код="Т101" ЕИ="шт">
<Запас Вид="1" Количество="10.00"/>
<Запас Вид="2" Количество="10.00"/>
</Товар>
<Товар Код="Т102" ЕИ="л">
<Запас Вид="1" Количество="1.00"/>
<Запас Вид="2" Количество="5.00"/>
</Товар>
<Товар Код="Т103" ЕИ="кг">
<Запас Вид="1" Количество="5.50"/>
<Запас Вид="2" Количество="10.00"/>
</Товар>
</Склад>
</ОстаткиТоваров>

Код поиска XPath

структура СтруктураТовары
обз пер Товары: Множество<СтруктураТовар>
;

структура СтруктураТовар
обз пер Код: Строка
обз пер КодСклада: Строка
обз пер ОбщееКоличество: Число
обз пер ЕИ: Строка
;

метод НайтиОстаткиТовараНаСкладе(ДокументXml: Файл)
знч КодСклада = "M002"
исп ПотокЧтения = ДокументXml.ОткрытьПотокЧтения()

знч ПрефиксыПространствИмен = {"": "http://company/data/stock"}
знч ПараметрыПоиска = {"КодСклада": КодСклада}

// Построение выражения с помощью интерполяции значения переменной
знч ВыражениеXPath = новый ВыражениеXPath("/ОстаткиТоваров/Склад[@Код = \$КодСклада]", ПрефиксыПространствИмен)
знч Поиск = новый ПоискXPath(ВыражениеXPath, ПараметрыПоиска)
знч УзелСклад = Поиск.НайтиПервый(ПотокЧтения)

если УзелСклад == Неопределено
возврат
;

// Общее количество товара на складе с помощью выражения XPath
знч ОбщееКоличество = ВычислитьОбщееКоличествоXPath(УзелСклад, ПрефиксыПространствИмен) //53.5

// Товары с общим количеством
знч Товары = НайтиТовары(УзелСклад)

// Коды товаров с количеством по виду запаса
// Построение выражения с установкой параметров, может быть выполнен несколько раз с разными значениями
знч ВыражениеXPath2 = новый ВыражениеXPath("Товар[Запас[@Вид = \$ВидЗапаса]/@Количество > \$Количество)]/@Код", ПрефиксыПространствИмен)
знч ПоискКодовТоваров = новый ПоискXPath(ВыражениеXPath2)

знч ПараметрВидЗапаса = 2
знч ПараметрКоличество = 5
знч КодыТоваров = НайтиКодыТоваровСОстаткамиПоВидуЗапаса(ПоискКодовТоваров, УзелСклад, ПараметрВидЗапаса, ПараметрКоличество) //{"T100", "T101", "T103"}

ПараметрВидЗапаса = 1
ПараметрКоличество = 5.4
// В качестве контекстного узла может быть передан другой найденный узел склада
КодыТоваров = НайтиКодыТоваровСОстаткамиПоВидуЗапаса(ПоискКодовТоваров, УзелСклад, ПараметрВидЗапаса, ПараметрКоличество) //{"Т101", "Т103"}
;

метод ВычислитьОбщееКоличествоXPath(УзелСклад: УзелXmlDom, ПрефиксыПространствИмен: ЧитаемоеСоответствие<Строка, Строка>): Число
знч ВыражениеXPath = новый ВыражениеXPath("sum(Товар/Запас/@Количество)", ПрефиксыПространствИмен)
знч Поиск = новый ПоискXPath(ВыражениеXPath)
знч ОбщееКоличество = Поиск.НайтиПервый(УзелСклад).ЗначениеКакЧисло()

возврат ОбщееКоличество
;

метод НайтиТовары(УзелСклад: УзелXmlDom): СтруктураТовары
пер ТоварыРезультат = новый СтруктураТовары(новый Множество<СтруктураТовар>())

знч Товары = УзелСклад.ПолучитьДочерниеУзлы("Товар")
для Товар из Товары
пер ОбщееКоличество: Число

знч КодТовара = Товар.ПолучитьАтрибут("Код").ЗначениеКакСтрока()
знч КодСклада = Товар.ПолучитьРодительскийУзел().ПолучитьАтрибут("Код").ЗначениеКакСтрока()
знч ЕИ = Товар.ПолучитьАтрибут("ЕИ").ЗначениеКакСтрока()

знч Запасы = Товар.ПолучитьДочерниеУзлы("Запас")
для Запас из Запасы
ОбщееКоличество += новый Число(Запас.ПолучитьАтрибут("Количество").ЗначениеКакСтрока())
;
ТоварыРезультат.Товары.Добавить(новый СтруктураТовар(КодТовара, КодСклада, ОбщееКоличество, ЕИ))
;

возврат ТоварыРезультат
;

метод НайтиКодыТоваровСОстаткамиПоВидуЗапаса(Поиск: ПоискXPath, УзелСклад: УзелXmlDom, ПараметрВидЗапаса: Число, ПараметрКоличество: Число): ЧитаемоеМножество<Строка>
знч КодыТоваров = новый Множество<Строка>()

Поиск.УстановитьПараметр("ВидЗапаса", ПараметрВидЗапаса.ВСтроку())
Поиск.УстановитьПараметр("Количество", ПараметрКоличество.ВСтроку())
знч УзлыКодыТоваров = Поиск.Найти(УзелСклад)

если УзлыКодыТоваров == Неопределено
возврат КодыТоваров
;

для УзелКодТовара из УзлыКодыТоваров
КодыТоваров.Добавить(УзелКодТовара.ЗначениеКакСтрока())
;

возврат КодыТоваров
;

См. также

ЧтениеXml


Конструкторы

ПоискXPath

ПоискXPath(
Выражение: ВыражениеXPath,
Параметры: ЧитаемоеСоответствие<Строка, Строка>? = Неопределено)
Конструктор поиска XPath

  • Выражение - выражение типа ВыражениеXPath
  • Параметры - соответствие Имя параметра (без $) - Значение параметра, по умолчанию Undefined

Исключения

ИсключениеНедопустимыйАргумент - если в выражении используется параметр, но он отсутствует в Параметры конструктора


Свойства

Выражение

ТолькоЧтение

Выражение: ВыражениеXPath

Выражение XPath.


Параметры

ТолькоЧтение

Параметры поиска в выражении XPath. Если не используются - Undefined.


Методы

Найти

Найти по выражению XPath, возвращает все найденные узлы, если не найдено, возвращается пустой массив.

Исключения

ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка. ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено.


НайтиКакМассив

Найти по выражению XPath и вернуть результат как массив, построенный по функции array в выражении XPath 3.1, если узлы не найдены - возвращается пустой массив.

Пример выражения XPath

[/root/row[@attr='a'][1], /root/row[@attr='b'][1], /root/row[@attr='c'][1]]

Исключения

ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка. ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено, или ошибка конвертации.


НайтиКакСоответствие

Найти по выражению XPath и вернуть результат как соответствие, построенное по функции map в выражении XPath 3.1, если узлы не найдены - в значении возвращается пустой массив.

Пример выражения XPath

map{'keyA': /root/row[@attr='a'][1], 'keyB': /root/row[@attr='b'][1]}

Исключения

ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка. ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено, или ошибка конвертации.


НайтиПервый

НайтиПервый(Источник: ПотокЧтения|УзелXmlDom): УзелXmlDom?
Найти по выражению XPath до первого найденного узла, если не найдено - Undefined.

Исключения

ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка. ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено.


УстановитьПараметр

УстановитьПараметр(
Имя: Строка,
Значение: Строка)
Установить параметр и его значение

  • Имя - имя параметра без префикса $
  • Значение - значение параметра

Исключения

ИсключениеНедопустимыйАргумент - при попытке установить параметр, который не используется в выражении XPath.


Список унаследованных методов

Объект

ВСтроку, ПолучитьТип, Представление