Поиск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, ПараметрВидЗапаса: Число, ПараметрКоличество: Число): ЧитаемоеМножество<Строка>
знч КодыТоваров = новый Множество<Строка>()
Поиск.УстановитьПараметр("ВидЗапаса", ПараметрВидЗапаса.ВСтроку())
Поиск.УстановитьПараметр("Количество", ПараметрКоличество.ВСтроку())
знч УзлыКодыТоваров = Поиск.Найти(УзелСклад)
если УзлыКодыТоваров == Неопределено
возврат КодыТоваров
;
для УзелКодТовара из УзлыКодыТоваров
КодыТоваров.Добавить(УзелКодТовара.ЗначениеКакСтрока())
;
возврат КодыТоваров
;