Beste programmeurs,

Als basic programmeur ben ik al 2 dagen bezig om een groot probleem op te lossen die waarschijnlijk heel simpel is voor de programmeur experts onder ons. Het volgende is er aan de hand.

Via onderstaand stukje script roep ik de status op van een bepaalde zending:


 $WebserviceClient = new SoapClient("http://xxx/App_Services/xxx.asmx?wsdl");
 $parameters= array("Username"=>$username, "Password"=>$password, "Zending"=>$zending, "Postcode"=>$postocde, "Referentie"=>$referentie);
 $WebmethodResult = $WebserviceClient->GetShipmentStatus($parameters) or die('FOUT!');


Als ik vervolgens via PRINT_R het resultaat in $WebmethodResult op het scherm toon krijg ik een response terug die begint met stdClass Object en daarna alle informatie over die bepaalde zending.

mijn print_r ziet er als volgt uit:

echo "<pre>";
  print_r($WebmethodResult);
echo "</pre>";


Als ik de BRONCODE van de code op het scherm bekijk zie ik veel code staan zoals
<MovementID>225362222</MovementID><ShipmentID>18815421</ShipmentID><CompanyID>985</CompanyID><MovementType>Afgeleverd</MovementType>

Mijn vraag is hoe ik met PHP de response ($WebmethodResult) uit de SOAP request kan benaderen zodat ik het MovementType element kan declareren in een variable waarna ik een if/else constructie kan maken zoals:


if(MovementType=="Afgeleverd"){ 
 #mail versturen# 
}else{
 #niets doen#
}


Ik hoop dat ik het probleem goed geschetst heb. Alle feedback is welkom.
Ik heb dat stuk inderdaad ook gezien. Ik heb hetgeen proberen na te bootsen echter kwam ik niet verder. Op dit miment heeft het stuk wat k hierboven gepost heb het enige resultaar zonder errors. Ik ben dus opzoek naar een fuctie om die lange array uit te lezen en daaruit die specifiek venoemde varabele te halen...

Heb je misschien nog een andere tip naast die link.?

[size=xsmall]Toevoeging op 18/01/2019 10:11:20:[/size]

Beste Adoptive Solutions,

Ik heb zowel de voorbeelden uit Example #11 DOM Interoperability en ook #10 geprobeerd.
Geen van beiden geeft het gewenste resultaat.

Ik kreeg steeds de melding dat SimpleXMLElement of loadXML een String verwacht maar dat ik of een array of een object geef. Hoe kan ik dit nu converteren? I"m lost in deze bewerking.
Heb nog wat nagezocht.

Gebaseerd op :

https://stackoverflow.com/questions/4194489/how-to-parse-soap-xml

<?php
$xml = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<PaymentNotification xmlns="http://apilistener.envoyservices.com">
			<payment>
				<uniqueReference>ESDEUR11039872</uniqueReference>      
				<epacsReference>74348dc0-cbf0-df11-b725-001ec9e61285</epacsReference>
				<postingDate>2019-01-05T15:19:45</postingDate>
				<bankCurrency>EUR</bankCurrency>
				<bankAmount>16.00</bankAmount>
				<appliedCurrency>EUR</appliedCurrency>
				<appliedAmount>1.00</appliedAmount>
				<countryCode>NL</countryCode>
				<bankInformation>Sean Wood</bankInformation>
				<merchantReference>ESDEUR11039872</merchantReference>
			</payment>
		</PaymentNotification>
		<PaymentNotification xmlns="http://apilistener.envoyservices.com">
			<payment>
				<uniqueReference>ESDEUR11040226</uniqueReference>      
				<epacsReference>74348dc0-cbf0-df11-b725-001ec9e61285</epacsReference>
				<postingDate>2019-01-15T15:19:45</postingDate>
				<bankCurrency>EUR</bankCurrency>
				<bankAmount>441.00</bankAmount>
				<appliedCurrency>EUR</appliedCurrency>
				<appliedAmount>1.00</appliedAmount>
				<countryCode>ES</countryCode>
				<bankInformation>Paul Newman</bankInformation>
				<merchantReference>ESDEUR11040226</merchantReference>
			</payment>
		</PaymentNotification>
	</soap:Body>
</soap:Envelope>';

$response = strtr( $xml, ['</soap:' => '</', '<soap:' => '<'] );
$output = json_decode( json_encode( simplexml_load_string( $response ) ) );
//var_dump($output->Body->PaymentNotification->payment);
echo '<pre>' . print_r( $output, TRUE ) . '</pre>';
?>


En deze :

https://stackoverflow.com/questions/21777075/how-to-convert-soap-response-to-php-array

Met dezelfde xml, maar nu als bestand.

<?php
$response = file_get_contents( 'soap.xml' );
$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, TRUE ) . '</pre>';
?>


Hallo Adoptive Solution,

Thank voor het zoekwerk. Echter ben ik deze beiden ook al tegengekomen.
Het issue is en blijft bij mij dat wanneer ik de examples verwerk in mijn kleine stukje script dat ik nog steeds de foutmeldingen blijf behouden van "function expect a string, object is given" of "expect a string, array is given".

Ik moet dus op één of andere manier de response die ik terug krijg omzetten naar een werkbaar XML bestand om daar vervolgens iets me te kunnen doen m.b.v. PHP.

Als ik de print_r functie gebruik voor de variabele "$WebmethodResult" dan krijg ik dit te zien op m'n scherm:

stdClass Object
(
    [GetShipmentStatusResult] => stdClass Object
        (
            [schema] => 
            [any] => 18237412Laadscan depotP78RayonAfgeleverdA47Rayon AfgeleverdA47Rayon
        )

)
Op basis van je summiere info heb ik dit gebakken

<?php
$xml = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<GetShipmentStatusResult>
			<schema></schema>
			<any>18237412Laadscan depotP78RayonAfgeleverdA47Rayon AfgeleverdA47Rayon</any>
		</GetShipmentStatusResult>
	</soap:Body>
</soap:Envelope>';

$response = strtr( $xml, ['</soap:' => '</', '<soap:' => '<'] );
$output = json_decode( json_encode( simplexml_load_string( $response ) ) );
//var_dump($output->Body->PaymentNotification->payment);
echo '<pre>' . print_r( $output, TRUE ) . '</pre>';
$output = $output->Body;
echo $output->GetShipmentStatusResult->any . '<br />';
?>


xml kan je laten zien met deze regel
<?php
echo '<pre>' . htmlentities($xml) . '</pre>';
?>

Bedankt voor je snelle reacties. Nou vraag ik me dan toch één ding wel af.
Hoe vul ik de $xml variabele?

In jouw voorbeeld gaat je er vanuit dat ik deze $xml gevuld heb.
Echter is alleen de variabele $WebmethodResult gevuld met de response. En deze response laat hetgeen zien ik gepost heb om 11:28

Moet ik dan zeggen: $xml = $WebmethodResult; ??
Want dat krijg ik wederom dezelfde melding "... expects parameter 1 to be string, object given"
Weet je zeker dat je niet ergens de tweede parameter van json_decode() mist, deze zou true moeten zijn. Dit zorgt ervoor dat objecten worden omgezet naar associatieve arrays.
Ik heb in een ander voorbeeld inderdaad ook iets geprobeerd met json_decode() waarbij de tweede parameter true was, maar ook daarbij krijg ik een foutmelding dat er een string wordt verwacht en niet een object of array.
Afgelopen weekend heb ik hier nog eens goed naar gekeken, maar ik krijg elke keer het stdClass Object terug met gegevens. Hoe kan ik deze nou uitlezen?
Maak er een array van door true mee te geven:

json_decode($json, true);


Reageren