pugixml:找出xpath是否与特定节点/属性匹配

时间:2012-08-15 16:14:49

标签: c++ xpath pugixml

鉴于xpath_queryxml_attributexml_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 个答案:

答案 0 :(得分:0)

使用

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