преобразовать ответ xml (из ZohoCRM) в простые пары ключ = значение (для SurveyGizmo) с помощью php или Zoho Creator

Это касается обмена данными между двумя веб-службами.

Я не понимаю, с чего начать. Любая помощь, указатели или даже полные решения :) очень признательны.

Опишу простым языком ...

SurveyGizmo может публиковать (вставлять) данные в ZohoCRM.

После вставки Zoho отвечает либо XML-ответом, который включает идентификатор вставленной записи.

Этот идентификатор нужен Gizmo для последующих обновлений.

Проблема в том, что Gizmo принимает ответ только в простом формате «ключ1 = значение1, ключ2 = значение2».

Я бы хотел, чтобы php-скрипт на моем сервере (или скрипт наводнения ZohoCreator) получал сообщение Gizmo, передавал его в ZohoCRM, получал ответ xml от Zoho, преобразовывал его в key = value и возвращал его в Gizmo.

Это то, что Gizmo отправляет в ZohoCRM:

https://crm.zoho.com/crm/private/xml/Cases/insertRecords?newFormat=2&apikey=KEYGOESHERE&ticket=TICKETGOESHERE&duplicateCheck=2&xmlData=
<Cases>
<row no="1">
<FL val="WHOID">contactidrelatedtocasebeinginserted</FL>
<FL val="Subject">mysubject</FL>
<FL val="Project">myproject</FL>
<FL val="Case Owner">myemail</FL>
</row>
</Cases>

Вот что Zoho CRM отвечает после вставки:

(00000 из Id - это то, что мне нужно вернуть в Gizmo как «Id = 000000»):

<response uri="/crm/private/xml/Cases/insertRecords">
<result>
<message>Record(s) inserted successfully</message>
<recorddetail>
<FL val="Id">00000</FL>
<FL val="Created Time">2011-11-03 20:14:44</FL>
<FL val="Modified Time">2011-11-03 21:34:39</FL>
<FL val="Created By">
<![CDATA[ Bamboo ]]>
</FL>
<FL val="Modified By">
<![CDATA[ Bamboo ]]>
</FL>
</recorddetail>
</result>
</response>

Большое спасибо.

Ниже приведен сценарий, который я использовал в другом месте. Я просто не уверен, где разместить синтаксический анализатор xml, чтобы вернуть ответ идентификатора на URL-адрес публикации.

////
/////note: the whole point of the script was to fix the hyphen to underscore in smtp-id so zoho would accept sendgrid
////
 define('POSTURL', 'https://creator.zoho.com/api/xml/USERNAME/test/add/');
 define('POSTVARS', '');  // POST VARIABLES TO BE SENT
 // INITIALIZE ALL VARS
 $event='';
 $email='';
 $response='';
 $attempt='';
 $url='';
 $status='';
 $reason='';
 $type='';
 $category='';
 $zoho_email_id='';
 $smtp_id='';
 $timestamp='';
 $ch='';
 $Rec_Data='';
 $Temp_Output='';

 if($_SERVER['REQUEST_METHOD']==='POST') {  // REQUIRE POST OR DIE
 if(isset($_POST['event'])) $event=$_POST['event'];  // GET event INTO VAR 
 if(isset($_POST['email'])) $email=$_POST['email'];  // GET email INTO VAR 
 if(isset($_POST['response'])) $response=$_POST['response'];  // GET response INTO VAR 
 if(isset($_POST['attempt'])) $attempt=$_POST['attempt'];  // GET attempt INTO VAR 
 if(isset($_POST['url'])) $url=$_POST['url'];  // GET url INTO VAR 
 if(isset($_POST['status'])) $status=$_POST['status'];  // GET status INTO VAR 
 if(isset($_POST['reason'])) $reason=$_POST['reason'];  // GET reason INTO VAR 
 if(isset($_POST['type'])) $type=$_POST['type'];  // GET type INTO VAR 
 if(isset($_POST['category'])) $category=$_POST['category'];  // GET category INTO VAR 
 if(isset($_POST['zoho_email_id'])) $zoho_email_id=$_POST['zoho_email_id'];  // GET zoho_email_id INTO VAR 
 if(isset($_POST['smtp-id'])) $smtp_id=$_POST['smtp-id'];  // GET smtp-id INTO VAR 
 if(isset($_POST['timestamp'])) $timestamp=$_POST['timestamp'];  // GET timestamp INTO VAR 

 $ch = curl_init(POSTURL);
 curl_setopt($ch, CURLOPT_POST      ,1);
 curl_setopt($ch, CURLOPT_POSTFIELDS    ,'apikey=APIKEY&zc_ownername=USERNAME&event='.$event.'&email='.$email.'&response='.$response.'&attempt='.$attempt.'&url='.$url.'&status='.$status.'&reason='.$reason.'&type='.$type.'&category='.$category.'&zoho_email_id='.$zoho_email_id.'&smtp_id='.$smtp_id.'&timestamp='.$timestamp);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1); 
 curl_setopt($ch, CURLOPT_HEADER      ,0);  // DO NOT RETURN HTTP HEADERS 
 curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);  // RETURN THE CONTENTS OF THE CALL
 $Rec_Data = curl_exec($ch);

 ob_start();
 header("Content-Type: text/html");
 $Temp_Output = ltrim(rtrim(trim(strip_tags(trim(preg_replace ( "/\s\s+/" , " " , html_entity_decode($Rec_Data)))),"\n\t\r\h\v\0 ")), "%20");
 $Temp_Output = ereg_replace (' +', ' ', trim($Temp_Output));
 $Temp_Output = ereg_replace("[\r\t\n]","",$Temp_Output);
 $Temp_Output = substr($Temp_Output,307,200);
 echo $Temp_Output;
 $Final_Out=ob_get_clean();
 echo $Final_Out;  
 curl_close($ch);
} else die('Blah! That didn't work!');

exit;

person David    schedule 04.11.2011    source источник
comment
Я добавил сценарий, с которым работаю @Vikk. Просто не уверен, где захватить возвращенный xml, чтобы повторить эхо.   -  person David    schedule 04.11.2011


Ответы (1)


Используйте simplexml в php для чтения и анализа xml. Если вам просто нужно получить идентификатор, вы можете сделать так просто:

$xml = simplexml_load_string($xml_string);          
$response = 'Id='.$xml->result->recorddetail->FL;

Вы можете пройти через всю структуру XML. Я предлагаю вам прочитать документ: http://www.php.net/manual/en/book.simplexml.php

person Vikk    schedule 04.11.2011