2016-10-04 41 views
1

我很努力合併具有屬性依賴性的XPath查詢中的2個條件。XPath,如何根據屬性依賴關係選擇基於2個條件的節點

我想選擇所有AdjsCI = 4005和AdjsRNCid = 280

<managedObject class="ADJS"> 
    <p name="AdjsCI">4005</p> 
    <p name="AdjsRNCid">280</p> 
</managedObject> 

節點爲它工作正常,只有一個條件,但我沒有找到2.

隨着1個條件:

SelectNodes(「// managedObject/p [@ name ='AdjsCI'] [text()='4005']」);

這一個是確定的。

但與2我已經嘗試了許多許多選項,但都沒有工作。 SelectNodes(「// managedObject/p [@ name ='AdjsCI'and @ name ='AdjsRNCid] [text()='4005'and text()='280']」); SelectNodes(「// managedObject/p [[@ name ='AdjsCI'] [text()='4005] and [@ name ='AdjsRNCid] [text()='280']]」); SelectNodes(「// managedObject/p [@ name ='AdjsCI'] [text()='4005']和// managedObject/p [@ name ='AdjsRNCid'] [text()='280 「]「);

有沒有解決方案呢?

非常感謝您提前。

若昂保羅

回答

2

你是在正確的軌道上。你需要把and的謂詞([]條件),是一定要把它相對於節​​點正在考慮:

//managedObject[p[@name='AdjsCI']=4005 and p[@name='AdjsRNCid']=280] 

注意,在情況下,如你在那裏的元素的完整內容是你正在共同對抗的,你不需要text()

0

你有幾個純粹基於問題中的XML的選項。

1.

SelectNodes("//managedObject/p[contains(@name,'Adjs') and (text()='4005' or text()='280')]"); 

2.

SelectNodes("//managedObject/p[(@name,'AdjsCI' or @name='AdjsRNCid') and (text()='4005' or text()='280')]"); 
3.

可以使XPath的更多通用的,如果你要選擇的沒有數據依賴性的節點。例如,

SelectNodes("//managedObject/p[contains(@name,'Adjs')); 

這將在name屬性中選擇包含Ajds的任何節點。

還有更多選項,例如可以使用的正則表達式。但是這應該解決您目前面臨的問題。

+0

你好Sai,謝謝你的快速回復,但沒有人在工作。第一個是給出91個結果,我應該只有2個。事實上,我想要找到LAC = 1800和CI = 4005的所有節點。使用您的選項1,我將獲得所有帶有LAC 1800的單元。第二個選項導致例如:未處理的異常:System.Xml.XPath.XPathException:'// managedObject/p [(@ name 'Adjsci'或@ name ='AdjsLAC')and(text()='4005'或text()=' 1800')]'有一個無效的標記。我改變@ name ='AdjsCI',然後沒有例外,但仍然是91。如果我把文本()='4005'和文本()='1800'我得到0:/ –