Verwerken van XML response vanuit SOAP request

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Johnny Cash

Johnny Cash

22/01/2019 11:14:21
Quote Anchor link
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.

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.
 
PHP hulp

PHP hulp

16/04/2024 21:51:56
 
Thomas van den Heuvel

Thomas van den Heuvel

22/01/2019 17:55:15
Quote Anchor link
Johnny Cash op 22/01/2019 10:49:27:
Op basis van jouw concept krijg ik het volgende op mijn scherm (output):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>
                        )
                )
        )
)


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
 
Johnny Cash

Johnny Cash

27/01/2019 23:08:46
Quote Anchor link
Hallo Thomas,

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.
 
- Ariën  -
Beheerder

- Ariën -

27/01/2019 23:57:40
Quote Anchor link
Hoe haal je nu die string dan op?
 
Thomas van den Heuvel

Thomas van den Heuvel

28/01/2019 00:57:47
Quote Anchor link
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.
 
Johnny Cash

Johnny Cash

28/01/2019 11:17:50
Quote Anchor link
De foutmelding is het resultaat vanuit: $data = simplexml_load_string($xml);

In $xml zit vervolgende de volgende data: $xml = $response['sub']['xml'];

En deze data wordt gevuld met de response zoals onderstaand:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'];
 
Thomas van den Heuvel

Thomas van den Heuvel

28/01/2019 16:15:55
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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?
 
Johnny Cash

Johnny Cash

28/01/2019 18:36:00
Quote Anchor link
Beste Thomas,

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!!
 

Pagina: « vorige 1 2



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.