En kollega till mig kom för några dagar sedan med ett XML-problem. Vi löste det på det enkla sättet, genom att manipulera data han hade. Jag kände att det var fel och ville göra det på rätt sätt, vilket gjorde att jag låg sömnlös i två nätter. Så idag mailade jag honom och frågade om han kunde skicka över XML-datat vi hade tittat på. Så vi hade den här filen:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <GetXmlQueryDataResponse xmlns="http://namspace.disclosed.com/"> <GetXmlQueryDataResult> <?xml version="1.0" encoding="UTF-16" ?><data><company id="1" name="jonasbjork.net"/></data> </GetXmlQueryDataResult> </GetXmlQueryDataResponse> </s:Body> </s:Envelope>
Från den filen ville vi få ut det som stod i GetXmlQueryDataResult-taggen, jag har ändrat informationen i filen för att skydda applikationen som skickar detta. Men iaf, det mest logiska är ju att ange sökvägen till den tagg vi vill komma åt:
$body = trim((string)$xml->Envelope->Body->GetXmlQueryDataResponse->GetXmlQueryDataResult); echo $body.PHP_EOL;
Kör den koden och vi får: PHP Notice: Trying to get property of non-object
. Fungerar alltså inte. Aha, XML-filen har namespaces, fixar vi lätt med lite ny kod:
$body = trim((string)$xml->{s:Envelope}->{s:Body}->GetXmlQueryDataResponse->GetXmlQueryDataResult); echo $body.PHP_EOL;
Kör koden och får PHP Parse error: syntax error, unexpected ':'
. Nehe, det fungerade inte heller. Brottas med en massa olika kodexempel hittade på spontana Google-sökningar. Inget verkar fungera, så kommer jag fram till följande:
$body = trim((string)$xml->children('http://schemas.xmlsoap.org/soap/envelope/')->children()->GetXmlQueryDataResponse->GetXmlQueryDataResult); echo $body.PHP_EOL;
Kör koden och får tillbaka <?xml version="1.0" encoding="UTF-16" ?><data><company id="1" name="jonasbjork.net"/></data>
. Fullständigt logiskt, eller hur? Att jag inte tänkte på det först.