0

I'm working on an outlook web add-in, I use GetItem to get the ChangeKey from the Exchange Web Service SOAP response, a value I need to compose further requests. The problem is that so far I haven't been able to get that. I have followed Find xml attribute values with javascript without success. I'm not sure I'm able to use other external libraries since this is hosted in an office365 environment.

This is what I have been trying to do

var responseXML = 
'<?xml version="1.0" encoding="utf-8"?>'+
' <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">'+
'   <s:Header>'+
'       <h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="3955" MinorBuildNumber="27" Version="V2018_01_08" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>'+
'   </s:Header>'+
'   <s:Body>'+
'       <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">'+
'           <m:ResponseMessages>'+
'               <m:GetItemResponseMessage ResponseClass="Success">'+
'                   <m:ResponseCode>NoError</m:ResponseCode>'+
'                   <m:Items>'+
'                       <t:Message>'+
'                           <t:ItemId Id="AAMkADZh" ChangeKey="CQABA"/>'+
'                           <t:Subject>the email subject</t:Subject>'+
'                       </t:Message>'+
'                   </m:Items>'+
'               </m:GetItemResponseMessage>'+
'           </m:ResponseMessages>'+
'       </m:GetItemResponse>'+
'   </s:Body>'+
'</s:Envelope>';

xmlDoc = $.parseXML(responseXML),
$xml = $(xmlDoc),
$itemId = $xml.find("ItemId");
$itemId.each(function(index, element) { 
    if(element.attributes["ChangeKey"]) {
        console.log("ChangeKey :" + element.attributes["ChangeKey"].value);
    }
});

but $itemId does not return a collection, although I'm expecting only one item, i think it doesn't hurt to leave the iteration prepared.

https://jsbin.com/matagujeye/1/edit?js,console

1 Answer 1

0

I found out here that I should include the name space and double escape the colons.

So the following code works:

var responseXML = 
'<?xml version="1.0" encoding="utf-8"?>'+
' <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">'+
'   <s:Header>'+
'       <h:ServerVersionInfo MajorVersion="15" MinorVersion="20" MajorBuildNumber="3955" MinorBuildNumber="27" Version="V2018_01_08" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>'+
'   </s:Header>'+
'   <s:Body>'+
'       <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">'+
'           <m:ResponseMessages>'+
'               <m:GetItemResponseMessage ResponseClass="Success">'+
'                   <m:ResponseCode>NoError</m:ResponseCode>'+
'                   <m:Items>'+
'                       <t:Message>'+
'                           <t:ItemId Id="AAMkADZh" ChangeKey="CQABA"/>'+
'                           <t:Subject>the email subject</t:Subject>'+
'                       </t:Message>'+
'                   </m:Items>'+
'               </m:GetItemResponseMessage>'+
'           </m:ResponseMessages>'+
'       </m:GetItemResponse>'+
'   </s:Body>'+
'</s:Envelope>';

xmlDoc = $.parseXML(responseXML),
$xml = $(xmlDoc),
$itemId = $xml.find("t\\:ItemId");
$itemId.each(function(index, element) { 
    if(element.attributes["ChangeKey"]) {
        console.log("ChangeKey :" + element.attributes["ChangeKey"].value);
    }
});
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.