0

I have done an ajax call to a webpage that contains xml. It returns the webpage as xml, how can I return it so it is more readable like json(convert it to JSON). I have looked into accepts headers but they don't seem to work. Here is my code:

            var jqXHR = jQuery.ajax({
            url: NBSBranchSiteContextURL , 
            accepts:{json:'application/json'},
            async:false            });
    alert(jqXHR.responseText);

The xml is :

  <?xml version="1.0" encoding="utf-8" ?> 
- <d:query xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:type="Microsoft.Office.Server.Search.REST.SearchResult">
  <d:ElapsedTime m:type="Edm.Int32">62</d:ElapsedTime> 
- <d:PrimaryQueryResult m:type="Microsoft.Office.Server.Search.REST.QueryResult">
  <d:CustomResults m:type="Collection(Microsoft.Office.Server.Search.REST.CustomResult)" /> 
  <d:QueryId>d6b8310d-58a6-49e0-bb0e-e9e10ca9de98</d:QueryId> 
  <d:QueryRuleId m:type="Edm.Guid">00000000-0000-0000-0000-000000000000</d:QueryRuleId> 
  <d:RefinementResults m:null="true" /> 
- <d:RelevantResults m:type="Microsoft.Office.Server.Search.REST.RelevantResults">
  <d:GroupTemplateId m:null="true" /> 
  <d:ItemTemplateId m:null="true" /> 
- <d:Properties>
- <d:element m:type="SP.KeyValue">
 <d:Key>GenerationId</d:Key> 
  <d:Value>9223372036854775806</d:Value> 
 <d:ValueType>Edm.Int64</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
 <d:Key>ExecutionTimeMs</d:Key> 
 <d:Value>15</d:Value> 
 <d:ValueType>Edm.Int32</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
 <d:Key>QueryModification</d:Key> 
 <d:Value>CostCentreBranchPrefix:JH123 ContentClass=urn:content-class:SPSPeople</d:Value> 
 <d:ValueType>Edm.String</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
 <d:Key>RenderTemplateId</d:Key> 
 <d:Value>~sitecollection/_catalogs/masterpage/Display Templates/Search/Group_Default.js</d:Value> 
 <d:ValueType>Edm.String</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
 <d:Key>StartRecord</d:Key> 
 <d:Value>0</d:Value> 
 <d:ValueType>Edm.Int32</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
 <d:Key>IsLastBlockInSubstrate</d:Key> 
 <d:Value>true</d:Value> 
 <d:ValueType>Edm.Boolean</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
 <d:Key>IsFirstBlockInSubstrate</d:Key> 
 <d:Value>false</d:Value> 
 <d:ValueType>Edm.Boolean</d:ValueType> 
 </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>IsFirstPinnedResultBlock</d:Key> 
  <d:Value>false</d:Value> 
  <d:ValueType>Edm.Boolean</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>IsLastPinnedResultBlock</d:Key> 


 <d:Value>false</d:Value> 
  <d:ValueType>Edm.Boolean</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>IsFirstRankedResultBlock</d:Key> 
  <d:Value>true</d:Value> 
  <d:ValueType>Edm.Boolean</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>IsLastRankedResultBlock</d:Key> 
  <d:Value>true</d:Value> 
  <d:ValueType>Edm.Boolean</d:ValueType> 
  </d:element>
  </d:Properties>
  <d:ResultTitle m:null="true" /> 
  <d:ResultTitleUrl m:null="true" /> 
  <d:RowCount m:type="Edm.Int32">2</d:RowCount> 
- <d:Table m:type="SP.SimpleDataTable">
- <d:Rows>
- <d:element m:type="SP.SimpleDataRow">
- <d:Cells>
- <d:element m:type="SP.KeyValue">
  <d:Key>Rank</d:Key> 
  <d:Value>6.42380905151367</d:Value> 
  <d:ValueType>Edm.Double</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>DocId</d:Key> 
  <d:Value>11</d:Value> 
  <d:ValueType>Edm.Int64</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>PreferredName</d:Key> 
  <d:Value>Dave</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>JobTitle</d:Key> 
  <d:Value>man</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>EmailAddress</d:Key> 
  <d:Value>daveH@</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>PartitionId</d:Key> 
  <d:Value>0c37852b-34d0-418e-91c6-2ac25af4be5b</d:Value> 
  <d:ValueType>Edm.Guid</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>UrlZone</d:Key> 
  <d:Value>0</d:Value> 
  <d:ValueType>Edm.Int32</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>AAMEnabledManagedProperties</d:Key> 
  <d:Value>AttachmentURI;deeplinks;DefaultEncodingURL;ExternalMediaURL;HierarchyUrl;OrgParentUrls;OrgUrls;OriginalPath;ParentLink;Path;PictureThumbnailURL;PictureURL;PublishingImage;recommendedfor;ServerRedirectedEmbedURL;ServerRedirectedPreviewURL;ServerRedirectedURL;SiteLogo;SitePath;SPSiteURL;UserEncodingURL</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>EditProfileUrl</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>ProfileViewsLastMonth</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>ProfileViewsLastWeek</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>ProfileQueriesFoundYou</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>RenderTemplateId</d:Key> 
  <d:Value>~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_Default.js</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
  </d:Cells>
  </d:element>
- <d:element m:type="SP.SimpleDataRow">
- <d:Cells>
- <d:element m:type="SP.KeyValue">
  <d:Key>Rank</d:Key> 
  <d:Value>6.42380905151367</d:Value> 
  <d:ValueType>Edm.Double</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>DocId</d:Key> 
  <d:Value>13</d:Value> 
  <d:ValueType>Edm.Int64</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>PreferredName</d:Key> 
  <d:Value>Asad</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>JobTitle</d:Key> 
  <d:Value>Software</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>EmailAddress</d:Key> 
  <d:Value>asadr@</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>PartitionId</d:Key> 
  <d:Value>0c37852b-34d0-418e-91c6-2ac25af4be5b</d:Value> 
  <d:ValueType>Edm.Guid</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>UrlZone</d:Key> 
  <d:Value>0</d:Value> 
  <d:ValueType>Edm.Int32</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>AAMEnabledManagedProperties</d:Key> 
  <d:Value>AttachmentURI;deeplinks;DefaultEncodingURL;ExternalMediaURL;HierarchyUrl;OrgParentUrls;OrgUrls;OriginalPath;ParentLink;Path;PictureThumbnailURL;PictureURL;PublishingImage;recommendedfor;ServerRedirectedEmbedURL;ServerRedirectedPreviewURL;ServerRedirectedURL;SiteLogo;SitePath;SPSiteURL;UserEncodingURL</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>EditProfileUrl</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>ProfileViewsLastMonth</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>ProfileViewsLastWeek</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>ProfileQueriesFoundYou</d:Key> 
  <d:Value m:null="true" /> 
  <d:ValueType>Null</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>RenderTemplateId</d:Key> 
  <d:Value>~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_Default.js</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
  </d:Cells>
  </d:element>
  </d:Rows>
  </d:Table>
  <d:TotalRows m:type="Edm.Int32">2</d:TotalRows> 
  <d:TotalRowsIncludingDuplicates m:type="Edm.Int32">2</d:TotalRowsIncludingDuplicates> 
  </d:RelevantResults>
  <d:SpecialTermResults m:null="true" /> 
  </d:PrimaryQueryResult>
- <d:Properties>
- <d:element m:type="SP.KeyValue">
  <d:Key>RowLimit</d:Key> 
  <d:Value>100</d:Value> 
  <d:ValueType>Edm.Int32</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>SourceId</d:Key> 
  <d:Value>b09a7990-05ea-4af9-81ef-edfab16c4e31</d:Value> 
  <d:ValueType>Edm.Guid</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>EnableInterleaving</d:Key> 
  <d:Value>true</d:Value> 
  <d:ValueType>Edm.Boolean</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>piPageImpression</d:Key> 
  <d:Value>23924_1185_2057</d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
- <d:element m:type="SP.KeyValue">
  <d:Key>SerializedQuery</d:Key> 
  <d:Value><Query Culture="en-GB" EnableStemming="True" EnablePhonetic="False" EnableNicknames="False" IgnoreAllNoiseQuery="True" SummaryLength="180" MaxSnippetLength="180" DesiredSnippetLength="90" KeywordInclusion="0" QueryText="CostCentreBranchPrefix:JH123" QueryTemplate="" TrimDuplicates="True" Site="09325ab3-1fbf-4798-8c94-9b7547bfae90" Web="b21f0568-898a-4fd0-b911-916c1491ba15" KeywordType="True" HiddenConstraints="" /></d:Value> 
  <d:ValueType>Edm.String</d:ValueType> 
  </d:element>
  </d:Properties>
  <d:SecondaryQueryResults m:type="Collection(Microsoft.Office.Server.Search.REST.QueryResult)" /> 
  <d:SpellingSuggestion m:null="true" /> 
  <d:TriggeredRules m:type="Collection(Edm.Guid)" /> 
  </d:query>

Where I want it to return, whether the <d:Key>PreferredName,JobTitle and Emails <d:Value> so in this case Dave, Asad for name. man and software for jobtitle and daveH@ and asadr@ for email. There could be more values in the future

user3956534
  • 73
  • 1
  • 1
  • 7
  • you mean, You want to convert xml to json – sameer Sep 03 '14 at 12:26
  • If you want to convert XML To JSON then go through this link http://stackoverflow.com/questions/1773550/xml-json-conversion-in-javascript – Karan Patyal Sep 03 '14 at 12:31
  • Why do you need to convert it to JSON? Do you need to supply the result to another service that requires JSON input? Is there a technical reason you can't use the traversible result of jQuery's `$.parseXML` function? – apsillers Sep 03 '14 at 12:31
  • what link? you didn't give one – user3956534 Sep 03 '14 at 12:32
  • 1
    Telling the server you only want to get JSON back only matters if the server bothers to pay attention to that header. – Quentin Sep 03 '14 at 12:55

2 Answers2

1

You can't force a server to provide the page as JSON (or anything else, for that matter) if it isn't set up to do so. Thus, as some comments have suggested, if you want it in JSON, you'll have to convert what you get back, although you might not need to (as you haven't said what you want to do with the data).

Scott Hunter
  • 48,888
  • 12
  • 60
  • 101
1

You can use dataType: "xml" to specify that the response is XML, and then read the data argument in the success callback or use responseXML property. The result can be traversed using a DOM API, identical to the API used to traverse HTML documents. This means that you can use jQuery to abstract the DOM away, just as it does with HTML DOM selection and traversal.

Suppose your XML is

<library>
    <book title="The Sun Also Rises" author="Hemingway" />
    <book title="The Hunger Games" author="Collins" />
    <magazine title="Time" issue="578" />
    <magazine title="Tacos Monthly" issue="3" />
</library>

You can fetch it and inspect it with jQuery:

var jqXHR = jQuery.ajax({
    url: NBSBranchSiteContextURL,
    dataType: "xml", 
    success: function(data) {
        $xml = $(data);

        // get title attribute of the first book, "The Sun Also Rises"
        $xml.find("book:eq(0)").attr("title");

        // get author attribute of the book entitled "The Hunger Games"
        $xml.find("book[title='The Hunger Games']").attr("author");

        $xml.find("magazine").each(function(idx, mag) {
            var $m = $(mag);
            alert($m.attr("title") + " " + $m.attr("issue"));
        });
    }
});
apsillers
  • 112,806
  • 17
  • 235
  • 239
  • I've added my XML to the question but am struggling to use your way on my xml – user3956534 Sep 03 '14 at 13:36
  • @user3956534 The XML is namespaced, which is a tremendous cross-browser headache (even with jQuery!). the best I can find is to do `.find("d\\:Value, Value")`. The colon must be escaped with `\\ `, and you have to provide an additional non-namespaced version so it works in Chrome. – apsillers Sep 03 '14 at 14:21