2012-08-15 109 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()

相關問題