Search code examples
phpxmlsoapsimplexml

PHP Parse SOAP XML Response


I can't figure out how to parse this XML response though I tried working with namespaces and simpleXML but still no result...any Ideas?

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header />
    <SOAP-ENV:Body>
        <ns3:GetDistrictByAddressResponse xmlns:ns3="http://il/co/bar/webservices/getdistrictbyaddress">
            <TimeFrameTable>
                <CustomerNumber>250</CustomerNumber>
                <Row>
                    <WindowDate>10052016</WindowDate>
                    <WeekDay>Sunday</WeekDay>
                    <FromHour>1130</FromHour>
                    <ToHour>1430</ToHour>
                </Row>
                <Row>
                    <WindowDate>10052016</WindowDate>
                    <WeekDay>Sunday</WeekDay>
                    <FromHour>1430</FromHour>
                    <ToHour>1730</ToHour>
                </Row>
            </TimeFrameTable>
        </ns3:GetDistrictByAddressResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Solution

  • xpath is your friend:

    xpath('//Row');
    

    Full example:

    $soap = <<< LOL
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Header />
        <SOAP-ENV:Body>
            <ns3:GetDistrictByAddressResponse xmlns:ns3="http://il/co/bar/webservices/getdistrictbyaddress">
                <TimeFrameTable>
                    <CustomerNumber>250</CustomerNumber>
                    <Row>
                        <WindowDate>10052016</WindowDate>
                        <WeekDay>Sunday</WeekDay>
                        <FromHour>1130</FromHour>
                        <ToHour>1430</ToHour>
                    </Row>
                    <Row>
                        <WindowDate>10052016</WindowDate>
                        <WeekDay>Sunday</WeekDay>
                        <FromHour>1430</FromHour>
                        <ToHour>1730</ToHour>
                    </Row>
                </TimeFrameTable>
            </ns3:GetDistrictByAddressResponse>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    LOL;
    $xml = simplexml_load_string($soap);
    foreach ($xml->xpath('//Row') as $item)
    {
        print_r($item);
    }
    

    Output:

    SimpleXMLElement Object
    (
        [WindowDate] => 10052016
        [WeekDay] => Sunday
        [FromHour] => 1130
        [ToHour] => 1430
    )
    SimpleXMLElement Object
    (
        [WindowDate] => 10052016
        [WeekDay] => Sunday
        [FromHour] => 1430
        [ToHour] => 1730
    )
    

    Ideone Demo