2010-09-10 6 views
3

Sitecore fournit un moyen d'échapper des mots dans une requête Sitecore contenant des caractères qu'ils n'aiment pas. Ces caractères comprennent les traits d'union et les espaces. Dans l'intérêt de simplifier ma vie, je l'ai écrit une simple fonction d'aide qui échapperait à chaque partie d'une requête Sitecore, et il a bien fonctionné pendant un certain temps:Echappement des mots réservés

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

(le Replace("#*#","*") est là parce que Sitecore ne comme quand vous envelopper l'astérisque dans les hachages).

Comme je l'ai dit, cela a bien fonctionné pendant un certain temps. Aujourd'hui, je suis tombé sur une situation où cela échoue:

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

La séquence échappé semble assez innocente:

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

mais la requête a échoué dans les Sitecore avec le message Identifier, GUID or "*" expected at position 44. J'ai réduit le problème à la #OR# dans la requête, et soudainement réalisé ce qui se passait. Apparemment, Sitecore prend le seul mot OR, même lorsqu'il est échappé, pour signifier que vous joignez deux ou plusieurs requêtes ensemble (c'est-à-dire, être le mot réservé OR). La solution évidente consiste à remplacer toutes les instances de #OR# par *[@@name='OR'], et cela fonctionne très bien. Cependant, pour moi, cela ressemble à un hack.

Je sais que ce sera très probablement ne se produira avec des noeuds nommés OR et AND, mais je ne peux trouver aucune documentation sur le SDN qui parle des mots réservés dans Sitecore requête, et il n'y a aucune mention sur la façon d'échapper correctement une requête, au-delà de l'encapsulation de la requête dans les hachages.

Existe-t-il actuellement un moyen standard d'échapper les requêtes où je serais certain de ne pas rencontrer ce problème? Ou, mieux encore, un document décrivant tous les mots réservés dans Sitecore Query? Je pourrais probablement m'en tenir à la syntaxe XPath, et traiter juste les cas de bord (documentés) avec l'échappement de ces valeurs, mais je voudrais m'en tenir à Sitecore Query si possible.

Répondre

4

Vous pouvez voir la liste des 'réservés' mots qui jetteront cette exception sur la méthode suivante

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

Essentiellement la liste est:

  • ancêtre
  • et
  • enfant
  • descendant
  • div
  • faux
  • suivant
  • mod
  • ou
  • parent
  • précédentes
  • auto
  • vrai
  • xor

I Dans ma recherche limitée, je n'ai pas trouvé de moyen d'échapper à ces mots-clés, donc vous pouvez vouloir coder dur autour de cette liste.

Questions connexes