2011-10-20 49 views
2

我想使用SelectNodes-Method和XPathNavigator-Class從XmlDocument-Object讀取一些節點。如何在C#中使用像exists()這樣的XPath函數?

但是C#是無法評估這個(與XMLSpy的驗證),XPath的快報:

//LogicUnit[exists(Level[@val = 'R'])]/LogicLines[exists(LogicLine/DATAVIEW_SRC)] 

的運行時拋出XPathException的「命名空間管理器或XsltContext需要此查詢具有前綴,變量或用戶。

我不明白這個例外,因爲我的XML文檔沒有使用任何命名空間,也沒有XSLT文檔。如果我使用任何XPATH函數,總是會出現此異常。

+0

什麼是'@ val'? –

回答

1

原因是它不能在沒有命名空間管理器的情況下使用函數,但是,您不需要使用函數,並且代碼以錯誤的方式使用該函數。你並不需要的功能存在(),看看是否存在的東西,從我看到你正在使用

//LogicUnit[exists(Level[@val = 'R'])] 

,你的意思是

//LogicUnit[Level[@val = 'R']] 
+1

謝謝,但XPath-Expression只是一個例子。有很多XPath-Expression需要評估,其中一些還使用了這些功能。 :-(...添加命名空間管理器只會導致另一個異常:「由於未知函數,此查詢需要XsltContext。」 – DiableNoir

1

使用 // LogicUnit [count(Level [@val ='R'])> 0]。

+1

count()> 1部分在那裏沒有意義,如果您要檢查count是否大於0,則與檢查它是否存在相同,以便//邏輯單元[Level [@ val ='R']]產生相同的結果。 – Woody

+0

你是完全正確的。由我贊成。 – riezebosch

4

的XPath函數存在()中的XPath被定義2.0,但.NET中的默認Microsoft XPath引擎僅支持XPath 1.0。如果您想要一個在.NET下運行的XPath 2.0引擎,請嘗試使用Saxon或XQSharp。

相關問題