在 javascript 的 SOAP 响应中查找 xml 属性值

Find xml attribute values in a SOAP response with javascript

我正在开发 outlook 网络插件,我使用 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 但没有成功。 我不确定我能否使用其他外部库,因为它托管在 office365 环境中。

这就是我一直在努力做的事情

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);
    }
});

但是 $itemId 不是 return 一个集合,虽然我只期待一个项目,但我认为让迭代做好准备并没有什么坏处。

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

我发现 here 我应该包含名称 space 并双重转义冒号。

所以下面的代码有效:

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);
    }
});