2012-08-15 288 views
1

给定xpath_queryxml_attributexml_node,我想知道该属性或节点是否与查询匹配。pugixml:找出xpath是否匹配特定的节点/属性

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

然而,这似乎有点昂贵。有更便宜的方法吗?

回答

0

使用

count(expressionSelectingTheNode | theQuery) = count(theQuery) 

,你需要替换上面的 “expressionSelectingTheNode” 和 “theQuery” 用正确的表达式。

当且仅当由表达式expressionSelectingTheNode选择的单个节点是由表达式theQuery选择的节点之一时,才会返回true()

如果我们有此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()

相关问题