Verwerken van XML response vanuit SOAP request
Toevoeging op 22/01/2019 17:46:11:
Ten einde raad. Ik wil degene belonen die me de verlossende oplossing aanreikt zodat ik kan uitlezen wat ik moet uitlezen.
Johnny Cash op 22/01/2019 10:49:27:
Op basis van jouw concept krijg ik het volgende op mijn scherm (output):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Array
(
[sub] => Array
(
[xml] => Array
(
[GetShipmentStatusResult] => Array
(
[schema] => <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"> .... etc. etc. .... </xs:schema>
[any] => <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><Shipment diffgr:id="Shipment1" msdata:rowOrder="0"><ShipmentID>18237421</ShipmentID></Shipment></NewDataSet></diffgr:diffgram>
)
)
)
)
(
[sub] => Array
(
[xml] => Array
(
[GetShipmentStatusResult] => Array
(
[schema] => <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"> .... etc. etc. .... </xs:schema>
[any] => <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet xmlns=""><Shipment diffgr:id="Shipment1" msdata:rowOrder="0"><ShipmentID>18237421</ShipmentID></Shipment></NewDataSet></diffgr:diffgram>
)
)
)
)
Mijn code was slechts een voorbeeld.
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
Gewijzigd op 22/01/2019 20:41:15 door Thomas van den Heuvel
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.
Hoe haal je nu die string dan op?
Johnny Cash op 27/01/2019 23:08:46:
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.
In $xml zit vervolgende de volgende data: $xml = $response['sub']['xml'];
En deze data wordt gevuld met de response zoals onderstaand:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Test case, bouw een soortgelijk genest object met hierin een XML-string
$wrapper = new StdClass();
$subObj = new StdClass();
$subObj->xml = $WebmethodResult;
$wrapper->sub = $subObj;
// zet objecten om naar (geneste) arrays
$response = json_decode(json_encode($wrapper), true);
// inspecteer output
dump($response);
// selecteer de XML-string
$xml = $response['sub']['xml'];
$wrapper = new StdClass();
$subObj = new StdClass();
$subObj->xml = $WebmethodResult;
$wrapper->sub = $subObj;
// zet objecten om naar (geneste) arrays
$response = json_decode(json_encode($wrapper), true);
// inspecteer output
dump($response);
// selecteer de XML-string
$xml = $response['sub']['xml'];
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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);
?>
// 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.
Ik heb je overigens een p.b. gestuurd.
PROBLEM SOLVED!!