2010-09-10 73 views
3

Sitecore提供了一種轉義Sitecore查詢中包含他們不喜歡的字符的方法。這些字符包括連字符和空格。在簡化我的生活的興趣,我寫了一個簡單的輔助功能,將逃脫Sitecore的查詢的每一個部分,它一會工作得很好:轉義保留字

public static string EscapePath(string path){ 
    return Regex.Replace(path, @"([^/]+)", "#$1#").Replace("#*#", "*"); 
} 

(該Replace("#*#","*")在那裏,因爲Sitecore的不喜歡它,當你在散列中包裹星號)。

正如我所說,這工作很好。今天,我碰到的情況下失敗:

EscapePath("/sitecore/content/Seattle/OR/00010046"); 

轉義序列看起來很無辜:

/#sitecore#/#content#/#Seattle#/#OR#/#00010046# 

但查詢與消息Identifier, GUID or "*" expected at position 44內Sitecore的失敗。我將問題縮小到查詢中的#OR#,並突然意識到發生了什麼。顯然,即使在逃脫的情況下,Sitecore也會獨自使用單詞OR,意味着您將兩個或多個查詢結合在一起(即保留字OR)。顯而易見的解決方法是用*[@@name='OR']替換#OR#的所有實例,而且工作得很好。但是,對我而言,這看起來像一個黑客。

我知道,這將最有可能只與一個名爲ORAND節點發生,但我找不到對談Sitecore的查詢中的任何保留字的SDN任何文件,而且也對如何正確逃生隻字不提一個查詢,除了在哈希中包裝查詢。

目前有一種逃避查詢的標準方式,我可以保證不會遇到這個問題嗎?或者,甚至更好,列出了Sitecore Query中所有保留字的文檔?我可以堅持使用XPath語法,只需處理(記錄的)邊緣案例並轉義這些值,但如果可能的話,我想堅持Sitecore Query。

回答

4

你可以看到的「保留」的單詞列表,將扔在下面的方法此異常

Sitecore.Data.Query.QueryTokenBuilder.Identifier(string) 

本質上的列表是:

  • 祖先
  • 孩子
  • 後裔
  • DIV
  • 以下
  • 國防部

我前面

  • 真正
  • XOR ñ我有限的研究,我沒有看到一種方法來逃避這些關鍵字,所以你可能想硬編碼這個列表。