Search code examples
sharepointsharepoint-2010sharepoint-webservice

SharePoint search web service with an ampersand


I am working on a JavaScript tool for my users to retrieve search results using predefined values. One of the predefined values has a phrase that contains an ampersand. I cannot figure out how to format the string so that the Query web service will return a value.

var eventCat = "Conference & Events";
var dateQ = "(DateStart>='" + startDate + "' AND DateStart<='" + endDate + "') AND ";
var eventQ = " EventCategory='" + eventCat + "' AND ";
var q = "SELECT Title,Path,Description,Write,Rank,Size,DateStart,DateEnd,EventCategory,GroupOnly  FROM SCOPE() WHERE ";
q += dateQ + eventQ + " GroupOnly=false AND (\"SCOPE\"='Sales Marketing & Excellence Events')";

var queryText = makeQuery(q);

makeQuery creates the XML needed the query web service, converting ampersands to &, < to < and > to >.

<QueryPacket xmlns='urn:Microsoft.Search.Query' Revision='1000'>
  <Query>
    <Context>
      <QueryText language='en-US' type='MSSQLFT'>
        SELECT 
          Title,Path,Description,Write,Rank,Size,DateStart,DateEnd,EventCategory,GroupOnly  
        FROM 
          SCOPE() 
        WHERE 
          (DateStart&gt;='2014-09-28T00:00:00Z' AND DateStart&lt;='2014-11-09T23:59:59Z') AND 
          EventCategory='Conference &amp; Events' AND  
          GroupOnly=false AND 
          ("SCOPE"='Sales Marketing & Excellence Events')
      </QueryText>
    </Context>
    <IncludeSpecialTermResults>true</IncludeSpecialTermResults>
  </Query>
</QueryPacket> 

This works as expected when eventCat has some other value like All, but when I send the query above, SharePoint returns an error: An error occurred while parsing EntityName.

I've tried replacing the ampersand with various alternatives and nothing I've done is working. What is the correct format to send?


Solution

  • I figured it out. I added <[CDATA[ around the query.

    <QueryPacket xmlns='urn:Microsoft.Search.Query' Revision='1000'>
      <Query>
        <Context>
          <QueryText language='en-US' type='MSSQLFT'><[CDATA[
            SELECT 
              Title,Path,Description,Write,Rank,Size,DateStart,DateEnd,EventCategory,GroupOnly  
            FROM 
              SCOPE() 
            WHERE 
              (DateStart>='2014-09-28T00:00:00Z' AND DateStart<='2014-11-09T23:59:59Z') AND 
              EventCategory='Conference & Events' AND  
              GroupOnly=false AND 
              ("SCOPE"='Sales Marketing & Excellence Events')
          ]]></QueryText>
        </Context>
        <IncludeSpecialTermResults>true</IncludeSpecialTermResults>
      </Query>
    </QueryPacket>