2012-11-21 38 views
1

我有一個XML文件,我想將三個不同的節點之一解析到我的C#程序中。對於任何XML文件,這三種不同的XPath中只有一種是有效的,並且每一種都儘可能具體。示例XPath低於:限制SelectSingleNode在多個XPath上的查詢時間

/ns:root/ns:foo/ns:bar[@barattr='{0}']/ns:foobar{1}/ns:{2} |      
/ns:root/ns:foo/ns:bar[@barattr='{0}']/ns:{2} |         
/ns:root/ns:foo/ns:bar[@barattr='{0}' and @{2}] 

注意,這些在他們格式化,因爲在代碼中我使用的String.Format動態生成這些查詢。我的問題是,如果第一個XPath返回一個節點(即存在ns:root/ns:foo/ns:bar [@barattr ='{0}']/ns:''),那麼SelectSingleNode會做什麼:foobar {1}/ns的:{2})?它仍然會查詢所有三個XPath並返回第一個XPath,還是會知道在那一刻停止?如果它仍然查詢所有三個,有沒有什麼辦法在C#或XPath中表示一旦找到匹配就停止?

感謝您的幫助!

回答

0

不在單個XPath表達式中。

你可以試試這個,而必須依靠優化的聰明使用:

Exp1 | Exp2[not(Exp1)] | Exp3[not(Exp1) and not(Exp2)] 

如果優化是一個體面的一個(在.NET的情況下,我相信這是) ,只有在Exp1沒有選擇一個節點的情況下才會評估Exp2,並且只有當Exp1和Exp2都沒有選擇節點時纔會評估Exp3。

+0

對不起,延遲,直到今天不在辦公室。我們是否有任何保證,一個體面的優化器也會緩存Exp1的結果,或者在這種情況下,Exp1可能會重新運行三次,以確保每次都不返回任何內容? –

+0

@DaveMcGinnis,最好的答案是嘗試一下。我99%肯定撒克遜會優化這一點。當我從工作中回到家時,我可以做一個小實驗 - 但你現在可以做你的 - 不要等待:) –

+0

所以我繼續嘗試了這一點,而這似乎根本不起作用。我不僅用新的查詢得到了無效的結果(我仍在研究的東西,以防萬一這是所有事情的根本原因,然而令人懷疑的是),但時間至少是以前的兩倍。驚訝MS沒有優化這個,但它看起來相當嚴峻。 –