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(),

Другие вопросы по тегам