0

I'm trying to get stop data from the OCTranspo Feed to include on a dashboard at home. The OCTranspo API allows you to get this data, which I have successfully got running in PHP.

Here is a copy of the response that I'm getting:

<soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:body>
    <getnexttripsforstopresponse xmlns="http://octranspo.com">
      <getnexttripsforstopresult>
        <stopno xmlns="http://tempuri.org/">9085</stopno>
        <stoplabel xmlns="http://tempuri.org/">FERNBANK BRIGHTSIDE</stoplabel>
        <error xmlns="http://tempuri.org/">
          <route xmlns="http://tempuri.org/">
            <routedirection>
              <routeno>61</routeno>
              <routelabel>Terry Fox</routelabel>
              <direction>Westbound</direction>
              <error>
                <requestprocessingtime>20171222231738</requestprocessingtime>
                <trips>
                  <trip>
                    <tripdestination>Stittsville</tripdestination>
                    <tripstarttime>21:57</tripstarttime>
                    <adjustedscheduletime>1</adjustedscheduletime>
                    <adjustmentage>0.82</adjustmentage>
                    <lasttripofschedule>false</lasttripofschedule>
                    <bustype>6LB - 60</bustype>
                    <latitude>45.248670</latitude>
                    <longitude>-75.912157</longitude>
                    <gpsspeed>48.9</gpsspeed>
                  </trip>
                  <trip>
                    <tripdestination>Stittsville</tripdestination>
                    <tripstarttime>22:27</tripstarttime>
                    <adjustedscheduletime>35</adjustedscheduletime>
                    <adjustmentage>0.47</adjustmentage>
                    <lasttripofschedule>false</lasttripofschedule>
                    <bustype>6EB - 60</bustype>
                    <latitude>45.343510</latitude>
                    <longitude>-75.820002</longitude>
                    <gpsspeed>74.1</gpsspeed>
                  </trip>
                  <trip>
                    <tripdestination>Stittsville</tripdestination>
                    <tripstarttime>22:57</tripstarttime>
                    <adjustedscheduletime>69</adjustedscheduletime>
                    <adjustmentage>0.88</adjustmentage>
                    <lasttripofschedule>false</lasttripofschedule>
                    <bustype>6EB - 60</bustype>
                    <latitude>45.419260</latitude>
                    <longitude>-75.656651</longitude>
                    <gpsspeed>40.0</gpsspeed>
                  </trip>
                </trips>
              </error>
            </routedirection>
          </route>
        </error>
      </getnexttripsforstopresult>
    </getnexttripsforstopresponse>
  </soap:body>
</soap:envelope>

I need to read this response in PHP, and have it output 'route label', 'route number' and 'direction', as well as each of the 'adjustedscheduletime' for each of the three trips that are listed.

I can load the response fine, but I can't get the PHP page to parse the xml feed.

Here is what I've tried so far:

<?php
$mySoapResponse=file_get_contents('https://api.octranspo1.com/v1.2/GetNextTripsForStop?appID={ID}&apiKey={key}&routeNo=61&stopNo=9085');

echo $mySoapResponse;
?>
  <br>
  <hr>
  <br>
  <?php
// Loads the XML
$soap = simplexml_load_string($mySoapResponse);
$soap->registerXPathNamespace('ns1', 'http://raspberrypi.local/');

// Grabs the trips
$trips = $soap->xpath('/ns1:getnexttripsforstopresponse/ns1:getnexttripsforstopresult/ns1:error/ns1:route/ns1:routedirection/ns1:error/ns1:trips');
$label = $soap->xpath('/ns1:getnexttripsforstopresponse/ns1:getnexttripsforstopresult/ns1:stoplabel');
echo $label[0];
//$trips = $xml->children('soap', true)->Body->getnexttripsforstopresponse->getnexttripsforstopresult->error->route->routedirection->error->trips->trip;

// Take the posts and generate some markup
foreach ($trips as $trip)
{

        echo '
                <p>' . $trip->tripstarttime . '</p>
                <p>' . $trip->adjustedscheduletime . '</p>
                <p>' . $trip->bustype . '</p>
        ';
}

?>

1 Answers1

0

Ok, I've got it now. Basically I just ditched the SOAP processing all together and converted it to XML. Followed the post here: PHP - XML Response into Array for some tips on XML parsing in PHP and voila.

Here's my final code:

<html>

<head>
  <link rel="stylesheet" type="text/css" href="stylish.css">
</head>

<body>
  <?php
$mySoapResponse=file_get_contents('https://api.octranspo1.com/v1.2/GetNextTripsForStop?appID={AppID}&apiKey={KEY}$
$clean_xml = str_ireplace(['SOAP-ENV:', 'SOAP:','soap:'], '', $mySoapResponse);
$xml = simplexml_load_string($clean_xml);

//print_r($xml);


// Grabs the trips
$arrTrips = $xml->Body->GetNextTripsForStopResponse->GetNextTripsForStopResult->Route->RouteDirection->Trips->Trip;
//print_r($arrTrips);

//Grabs the route info
$routeInfo=$xml->Body->GetNextTripsForStopResponse->GetNextTripsForStopResult->Route->RouteDirection;

echo '<H1>Route ' . $routeInfo->RouteNo . ' ' . $routeInfo->RouteLabel . ' ' . $routeInfo->Direction . '</H1>';
echo '<h2>Next Trips</h2>';
// Take the posts and generate some markup
$i=1;
foreach ($arrTrips as $trip)
{

        echo '<p> ' . $i . '. Arrives in ' . $trip->AdjustedScheduleTime . ' minutes at ' . $trip->TripStartTime . '</p>';
        $i=$i+1;
}

?>
</body>

</html>