Поиск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, ПараметрВидЗапаса: Число, ПараметрКоличество: Число): ЧитаемоеМножество<Строка>
знч КодыТоваров = новый Множест во<Строка>()
Поиск.УстановитьПараметр("ВидЗапаса", ПараметрВидЗапаса.ВСтроку())
Поиск.УстановитьПараметр("Количество", ПараметрКоличество.ВСтроку())
знч УзлыКодыТоваров = Поиск.Найти(УзелСклад)
если УзлыКодыТоваров.Пусто()
возврат КодыТоваров
;
для УзелКодТовара из УзлыКодыТоваров
КодыТоваров.Добавить(УзелКодТовара.ЗначениеКакСтрока())
;
возврат КодыТоваров
;
См. также
Конструкторы
ПоискXPath
ПоискXPath(
Выражение: ВыражениеXPath,
Параметры: ЧитаемоеСоответствие<Строка, Строка>? = Неопределено)- Выражение - выражение типа ВыражениеXPath
- Параметры - соответствие Имя параметра (без $) - Значение параметра, по умолчанию
Неопределено
Исключения
ИсключениеНедопустимыйАргумент - если в выражении используется параметр, но он отсутствует в Параметры конструктора
Свойства
Выражение
ТолькоЧтение
Выражение: ВыражениеXPathВыражение XPath.
Параметры
ТолькоЧтение
Параметры: ЧитаемоеСо ответствие<Строка, Строка>?Параметры поиска в выражении XPath. Если не используются - Неопределено.
Методы
Найти
Найти(Источник: ПотокЧтения|УзелXmlDom): ЧитаемыйМассив<УзелXmlDom>Исключения
ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка.
ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено.
НайтиКакМассив
НайтиКакМассив(Источник: ПотокЧтения|УзелXmlDom): ЧитаемыйМассив<ЧитаемыйМассив<УзелXmlDom>>Пример выражения XPath
[/root/row[@attr='a'][1], /root/row[@attr='b'][1], /root/row[@attr='c'][1]]
Исключения
ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка.
ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено, или ошибка конвертации.
НайтиКакСоответствие
НайтиКакСоответствие(Источник: ПотокЧтения|УзелXmlDom): ЧитаемоеСоответствие<Строка, ЧитаемыйМассив<УзелXmlDom>>Пример выражения XPath
map{'keyA': /root/row[@attr='a'][1], 'keyB': /root/row[@attr='b'][1]}
Исключения
ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка.
ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено, или ошибка конвертации.
НайтиПервый
НайтиПервый(Источник: ПотокЧтения|УзелXmlDom): УзелXmlDom?Неопределено.
Исключения
ИсключениеПостроенияXmlDom - если в качестве источника используется ПотокЧтения, и при построении документа XML возникнет ошибка.
ИсключениеПоискаXPath - если в выражении XPath используется параметр, но при поиске его значение не было установлено.
УстановитьПараметр
Установить параметр и его значение- Имя - имя параметра без префикса $
- Значение - значение параметра
Исключения
ИсключениеНедопустимыйАргумент - при попытке установить параметр, который не используется в выражении XPath.