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']
,这样就可以了。然而,对我来说,这看起来像是一个黑客。
我知道这很可能只发生在名为OR
和AND
的节点上,但我找不到SDN上有关Sitecore中任何保留字的任何文档查询,除了将查询包装在哈希中之外,没有提及如何正确地转义查询。
目前是否存在一种逃避查询的标准方法,我保证不会遇到此问题?或者,更好的是,一份文档概述了Sitecore Query中的所有保留字?我可能会坚持使用XPath语法,只是通过转义这些值来处理(记录的)边缘情况,但是如果可能的话我想坚持使用Sitecore Query。
答案 0 :(得分:4)
您可以看到将在以下方法中引发此异常的“保留”单词列表
Sitecore.Data.Query.QueryTokenBuilder.Identifier(string)
基本上,列表是:
在我的有限研究中,我没有看到逃避这些关键字的方法,因此您可能想要在此列表中进行硬编码。