pugixml: выяснить, соответствует ли xpath определенному узлу / атрибуту
Учитывая xpath_query
и xml_attribute
или же xml_node
Я хочу знать, будет ли этот атрибут или узел соответствовать запросу.
Я мог бы оценить запрос к xpath_node_set
и затем проверьте, находится ли узел внутри так:
bool match(const pugi::xpath_query& query, const pugi::xml_node& node)
{
for (const auto& child : query.evaluate_node_set(node.parent()))
{
if (child.node() == node)
return true;
}
return false;
}
Однако это кажется немного дорогостоящим. Есть ли более дешевый способ?
1 ответ
Используйте:
count(expressionSelectingTheNode | theQuery) = count(theQuery)
где вам нужно заменить вышеуказанные "expressionSelectingTheNode " и "theQuery" правильными выражениями.
Это возвращает true()
если и только если один узел выбран выражением expressionSelectingTheNode
является одним из узлов, выбранных выражением theQuery
,
Пример:
Если у нас есть этот документ XML:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
И узел (выбран /*/num[. = 6]
):
<num>06</num>
и выражение (выбирает все num
элементы, значение которых кратно 2 и кратно 3):
/*/num[. mod 2 = 0 and . mod 3 = 0]
Затем мы оцениваем это выражение:
count(/*/num[. = 6] | /*/num[. mod 2 = 0 and . mod 3 = 0])
=
count(//*/num[. mod 2 = 0 and . mod 3 = 0])
и результат true()
,
Если мы оценим это выражение (желая посмотреть, если <num>05</num>
также выбран):
count(/*/num[. = 5] | /*/num[. mod 2 = 0 and . mod 3 = 0])
=
count(//*/num[. mod 2 = 0 and . mod 3 = 0])
результат сейчас false()
,