2016-05-24 2 views
1

Я использую следующий код, чтобы отправить запрос в службу SOAP:Анализировать XML SOAP ответ PHP

header('Content-type: application/xml'); 

function doXMLCurl($url,$postXML){ 
    $CURL = curl_init(); 
    curl_setopt($CURL, CURLOPT_URL, $url); 
    curl_setopt($CURL, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($CURL, CURLOPT_POST, 1); 
    curl_setopt($CURL, CURLOPT_POSTFIELDS, $postXML); 
    curl_setopt($CURL, CURLOPT_HEADER, false); 
    curl_setopt($CURL, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($CURL, CURLOPT_HTTPHEADER, array('Accept: text/xml','Content-Type: application/soap+xml')); 
    curl_setopt($CURL, CURLOPT_RETURNTRANSFER, true); 
    $xmlResponse = curl_exec($CURL); 
    return $xmlResponse; 
} 

$input_xml = '<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">.....</s:Envelope>'; 

echo doXMLCurl('webservice_url', $input_xml); 

Отвечает является XML тоже.

Как я могу разобрать эти данные или преобразовать их в массив или объект? Я пробовал с simplexml_load_string(), но безуспешно.

EDIT

XML-ответ:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">...</a:Action> 
    </s:Header> 
    <s:Body> 
     <ListStatesResponse xmlns="http://tempuri.org/"> 
     <ListStatesResult xmlns:b="..." xmlns:i="..."> 
      <b:Return>0</b:Return> 
      <b:Message i:nil="true"/> 
      <b:Status>00</b:Status> 
      <b:ListStates> 
       <b:States> 
        <b:Description>ACRE</b:Description> 
        <b:Code>AC</b:Code> 
       </b:States> 
       <b:States> 
        <b:Description>ALAGOAS</b:Description> 
        <b:Code>AL</b:Code> 
       </b:States> 
       <b:States> 
        <b:Description>AMAZONAS</b:Description> 
        <b:Code>AM</b:Code> 
       </b:States> 
       ... 
      </b:ListStates> 
     </ListStatesResult> 
     </ListStatesResponse> 
    </s:Body> 
</s:Envelope> 
+0

Вы можете разместить образец из '$ xmlResponse'? –

+0

Да! Отредактировал ответ. – RodrigoFW

ответ

0

Я нашел самый простой способ заключается в использовании функции JSon

$jsonObject = json_decode(json_encode($xmlString)); 

Тогда print_r($jsonObject) найти структуру. Это позволяет атрибуты должны быть доступны для использования $jsonObject->{'@attributes'}->id;

+0

Почему вы используете 'json_decode (json_encode'? –

0

Предполагая, что xml действительно, вы можете использовать SimpleXMLElement, то есть:

$xml = new SimpleXMLElement($xmlResponse); 
echo $xml->node->otherNode['Id']; 

Для цикла это, используйте:

foreach ($xml->node->otherNode as $el) { 
    foreach($el as $key => $val) { 
    echo "{$key}: {$val}"; 
    } 
} 
+1

print_r ($ xml) возвращает только объект SimpleXMLElement() – RodrigoFW

Смежные вопросы