2010-09-10 68 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 ñ我有限的研究,我没有看到一种方法来逃避这些关键字,所以你可能想硬编码这个列表。