逃避保留字

时间:2010-09-10 18:44:21

标签: escaping sitecore

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#

但是Sitecore中的查询失败并显示消息Identifier, GUID or "*" expected at position 44。我将问题缩小到查询中的#OR#,然后突然意识到发生了什么。显然,即使在转义时,Sitecore也会使用单词OR来表示您要将两个或多个查询连接在一起(即保留字OR)。显而易见的解决方法是将#OR#的所有实例替换为*[@@name='OR'],这样就可以了。然而,对我来说,这看起来像是一个黑客。

我知道这很可能只发生在名为ORAND的节点上,但我找不到SDN上有关Sitecore中任何保留字的任何文档查询,除了将查询包装在哈希中之外,没有提及如何正确地转义查询。

目前是否存在一种逃避查询的标准方法,我保证不会遇到此问题?或者,更好的是,一份文档概述了Sitecore Query中的所有保留字?我可能会坚持使用XPath语法,只是通过转义这些值来处理(记录的)边缘情况,但是如果可能的话我想坚持使用Sitecore Query。

1 个答案:

答案 0 :(得分:4)

您可以看到将在以下方法中引发此异常的“保留”单词列表

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

基本上,列表是:

  • 的祖先
  • 后裔
  • DIV
  • 以下
  • MOD
  • 前述
  • XOR

在我的有限研究中,我没有看到逃避这些关键字的方法,因此您可能想要在此列表中进行硬编码。