Door
Johnny Cash
op 17-01-2019 17:44
gewijzigd op 17-01-2019 17:50
7.041 views
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.
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:
Ik heb al vaker XML files uitgelezen vanuit SOAP requests, echter is het bij deze een ramp om er iets uit te lezen. Ik heb geen ervaring met dergelijke opmaak van XML. De kluts hierin helemaal kwijt.
[size=xsmall]Toevoeging op 22/01/2019 17:46:11:[/size]
Ten einde raad. Ik wil degene belonen die me de verlossende oplossing aanreikt zodat ik kan uitlezen wat ik moet uitlezen.
Je moet het zo zien: je zet met die json_en/decode riedel je oorspronkelijke response om in een array. Dan zit er ergens in dat array onder een bepaalde index een lap XML als tekst. Vervolgens peuter je deze XML uit dit array door die index aan te spreken, pas je hier de eerdergenoemde simplexml-functie op toe zodat je weer een object hebt, waar je vervolgens weer die json_en/decode truuk op loslaat. Dan heb je wederom een array met XML-data, waar ergens de informatie in zit die je wilt hebben.
Je doet dus eigenlijk twee keer precies hetzelfde, de informatie zit als het ware dubbel verpakt in twee soortgelijke enveloppen.
Samenvattend:
- zet invoer om naar array met json_decode(json_encode(<invoer>), true)
- vis de XML-string uit dit array
- zet deze string om naar een SimpleXMLElement object m.b.v. simplexml_load_string(<XML string>)
- zet dit object weer om naar een array met json_decode(json_encode(<SimpleXMLElement object>), true)
- nu heb je een array van XML-data waar je jouw informatie makkelijk uit kunt halen
De samenvatting die je heb geschreven op 22 januari heb ik stap voor stap doorlopen en uitgevoerd.
Maar toch blijf ik de foutmelding krijgen "Warning: simplexml_load_string() expects parameter 1 to be string, array given in..."
Ik heb dit uitgevoerd zoals ik in m'n eerdere post heb aangegeven.
Light het nu aan mij of is de response van de webserver waar ik de call naar doe gewoon erg chaotisch?
Feit blijft dat ik niet de gewenste data eruit kan vissen helaas.
Light het nu aan mij of is de response van de webserver waar ik de call naar doe gewoon erg chaotisch?
Ik denk dat je de XML van de verkeerde plek probeert te pakken, waarschijnlijk zit je een array-niveau te hoog, dan is het ook niet zo verwonderlijk dat je een array terugkrijgt.
Welke invoer zorgt precies voor die melding? Als je dat ding dumpt naar je scherm je zul je waarschijnlijk zien dat het een array betreft waar nog ergens die lap XML in zit.
Je hebt nu mijn voorbeeld met jouw eigen code gecombineerd. Mijn voorbeeld was enkel bedoeld om te illustreren hoe je deze data "uitpakt" en omzet zodat je makkelijk bij de XML-waarden kunt komen.
Jouw uitgangspunt zou die $WebmethodResult moeten zijn.
Als ik de structuur van jouw vorige reacties goed begrijp dien je hier achtereenvolgens de volgende bewerkingen op uit te voeren om makkelijk bij de XML te kunnen komen.
<?php
// stap 1: zet $WebmethodResult om naar een array
$responseArray = json_decode(json_encode($WebmethodResult), true);
// stap 2: vis de index uit dit array die de XML bevat
$xmlString = $responseArray['GetShipmentStatusResult']['schema'];
// stap 3: maak van deze string een object
$xmlObject = simplexml_load_string($xmlString);
// stap 4: maak van dit object een array
$xmlArray = json_decode(json_encode($xmlObject), true);
// nu bevat $xmlArray als het goed is de response data van de XML
dump($xmlArray);
?>
Veel duidelijker dan dit kan ik het niet uitleggen. Mocht het nog steeds niet lukken dan stel ik voor dat je hulp inschakelt van iemand die even langs je aan het bureau kan aanschuiven, dat is namelijk stukken makkelijker om dit soort zaken snel op te lossen.
Ook denk ik dat het belangrijk is dat je ook begrijpt wat er precies gebeurt want ik heb een beetje de indruk dat dit allemaal hocus pocus is voor jou?
Bedankt voor je feedback. Ik heb jouw voorbeeld opnieuw verwerkt en heb daarbij eens goed gekeken waarom ik het moeilijker maakte dan het schijnbaar dus is. Ik heb me te blind gestaard op de foutmeldingen etc. en wist niet meer hoe ik het kon oplossen.
Het was inderdaad hocus pocus voor mij omdat ik "plotseling" moest afwijken van een ander type webserver response dan ik gewend ben van andere partijen.
Uiteindelijk krijg ik nu een bericht op m'n scherm waar ik echt wat mee kan.