1

给定一个xpath_query和一个xml_attributeor xml_node,我想知道该属性或节点是否会被查询匹配。

我可以将查询评估为 anxpath_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;
}

不过,这似乎有点贵。有没有更便宜的方法?

4

1 回答 1

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

于 2012-08-16T03:24:51.073 回答