Nathan30
Nathan30

Reputation: 899

Transform SOAP return to Array

I have this return from a SOAP webservice :

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:historyResponse xmlns:ns2="XXXXXXXXXX">
         <return>
            <userFullname>AGENT</userFullname>
            <date>2018-08-01T17:24:20.948+02:00</date>
            <stateName>Préparé</stateName>
         </return>
         <return>
            <userFullname>PARAPHEUR</userFullname>
            <date>2018-08-01T17:24:21.039+02:00</date>
            <stateName>Envoyé pour signature</stateName>
         </return>
         <return>
            <userFullname>Administrator</userFullname>
            <date>2018-08-01T17:24:21.228+02:00</date>
            <stateName>Signé</stateName>
         </return>
         <return>
            <userFullname>PARAPHEUR</userFullname>
            <date>2018-08-01T17:24:21.324+02:00</date>
            <stateName>Classé</stateName>
         </return>
      </ns2:historyResponse>
   </soap:Body>
</soap:Envelope>

When I consume this webservice through PHP and CURL I just get a string like this (var dump) :

string(728) "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:historyResponse xmlns:ns2="http://sei.ws.fast.cdc.com/"><return><userFullname>AGENT EDISSYUM</userFullname><date>2018-08-01T17:24:20.948+02:00</date><stateName>Préparé</stateName></return><return><userFullname>PARAPHEUR </userFullname><date>2018-08-01T17:24:21.039+02:00</date><stateName>Envoyé pour signature</stateName></return><return><userFullname>Administrator </userFullname><date>2018-08-01T17:24:21.228+02:00</date><stateName>Signé</stateName></return><return><userFullname>PARAPHEUR </userFullname><date>2018-08-01T17:24:21.324+02:00</date><stateName>Classé</stateName></return></ns2:historyResponse></soap:Body></soap:Envelope>"

How could I have from this string an array of "return" ?

Upvotes: 0

Views: 35

Answers (1)

Nimeshka Srimal
Nimeshka Srimal

Reputation: 8950

You can use simplexml_load_string() and json functions to convert it to an array. (note that you need to replace the colons as this function doesn't recognize xml with namespaces for some reason)

$response = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:historyResponse xmlns:ns2="http://sei.ws.fast.cdc.com/"><return><userFullname>AGENT EDISSYUM</userFullname><date>2018-08-01T17:24:20.948+02:00</date><stateName>Préparé</stateName></return><return><userFullname>PARAPHEUR </userFullname><date>2018-08-01T17:24:21.039+02:00</date><stateName>Envoyé pour signature</stateName></return><return><userFullname>Administrator </userFullname><date>2018-08-01T17:24:21.228+02:00</date><stateName>Signé</stateName></return><return><userFullname>PARAPHEUR </userFullname><date>2018-08-01T17:24:21.324+02:00</date><stateName>Classé</stateName></return></ns2:historyResponse></soap:Body></soap:Envelope>';

//I'm not the author of this regex ;)
$xml = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);

$xml = simplexml_load_string($xml);
$json = json_encode($xml);
$responseArray = json_decode($json,true);

echo '<pre>';
print_r($responseArray);

Hope it helps!! Feel free to ask if you have any doubts :)

Upvotes: 1

Related Questions