Избегание зарезервированных слов - PullRequest
3 голосов
/ 10 сентября 2010

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 Query, и нет никаких упоминаний о том, как правильно экранировать запрос, кроме того, чтобы обернуть запрос в хэши.Я бы гарантированно не столкнулся с этой проблемой?Или, что еще лучше, документ с изложением всех зарезервированных слов в Sitecore Query?Возможно, я мог бы придерживаться синтаксиса XPath и просто иметь дело с (задокументированными) крайними случаями с экранированием этих значений, но я бы хотел придерживаться Sitecore Query, если это возможно.

1 Ответ

4 голосов
/ 13 сентября 2010

Вы можете увидеть список «зарезервированных» слов, которые будут вызывать это исключение, по следующему методу

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

По сути, список:

  • предок
  • и
  • дочерний
  • потомок
  • div
  • false
  • следующий
  • мод
  • или
  • родитель
  • предшествующий
  • self
  • true
  • xor

В моем ограниченном исследованииЯ не видел способа избежать этих ключевых слов, поэтому вы можете захотеть жестко закодировать этот список.

...