public static function parseHafasXml($serverData, $lang, $fast) { $xml = new SimpleXMLElement($serverData); $connection = []; $i = 0; //DEBUG: //echo $serverData ; if (isset($xml->ConRes->ConnectionList->Connection)) { //get stations from & to once for all connections $fromstation = connections::getStationFromHafasDescription($xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['name'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Departure->BasicStop->Station['y'], $lang); $tostation = connections::getStationFromHafasDescription($xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['name'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['x'], $xml->ConRes->ConnectionList->Connection[0]->Overview->Arrival->BasicStop->Station['y'], $lang); foreach ($xml->ConRes->ConnectionList->Connection as $conn) { $connection[$i] = new Connection(); $connection[$i]->departure = new DepartureArrival(); $connection[$i]->arrival = new DepartureArrival(); $connection[$i]->duration = tools::transformDuration($conn->Overview->Duration->Time); $connection[$i]->departure->station = $fromstation; $connection[$i]->departure->time = tools::transformTime($conn->Overview->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $connection[$i]->departure->platform = new Platform(); $connection[$i]->departure->direction = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->departure->platform->name = trim($conn->Overview->Departure->BasicStop->Dep->Platform->Text); $connection[$i]->arrival->time = tools::transformTime($conn->Overview->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $connection[$i]->arrival->platform = new Platform(); $connection[$i]->arrival->platform->name = trim($conn->Overview->Arrival->BasicStop->Arr->Platform->Text); $connection[$i]->arrival->station = $tostation; //Delay and platform changes //TODO: get Delay from railtime instead - much better information $delay0 = 0; $delay1 = 0; $platformNormal0 = true; $platformNormal1 = true; if ($conn->RtStateList->RtState["value"] == "HAS_DELAYINFO") { $delay0 = tools::transformTime($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Time, $conn->Overview->Date) - $connection[$i]->departure->time; if ($delay0 < 0) { $delay0 = 0; } //echo "delay: " .$conn->Overview -> Departure -> BasicStop -> StopPrognosis -> Dep -> Time . "\n"; $delay1 = tools::transformTime($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Time, $conn->Overview->Date) - $connection[$i]->arrival->time; if ($delay1 < 0) { $delay1 = 0; } if (isset($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text)) { $platform0 = trim($conn->Overview->Departure->BasicStop->StopPrognosis->Dep->Platform->Text); $platformNormal0 = false; } if (isset($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text)) { $platform1 = trim($conn->Overview->Arrival->BasicStop->StopPrognosis->Arr->Platform->Text); $platformNormal1 = false; } } $connection[$i]->departure->delay = $delay0; $connection[$i]->departure->platform->normal = $platformNormal0; $connection[$i]->arrival->delay = $delay1; $connection[$i]->arrival->platform->normal = $platformNormal1; $trains = []; $vias = []; $directions = []; $j = 0; $k = 0; $connectionindex = 0; //yay for spaghetti code. if (isset($conn->ConSectionList->ConSection)) { foreach ($conn->ConSectionList->ConSection as $connsection) { if (isset($connsection->Journey->JourneyAttributeList->JourneyAttribute)) { foreach ($connsection->Journey->JourneyAttributeList->JourneyAttribute as $att) { if ($att->Attribute["type"] == "NAME") { $trains[$j] = str_replace(" ", "", $att->Attribute->AttributeVariant->Text); $j++; } elseif ($att->Attribute["type"] == "DIRECTION") { $__stat = new stdClass(); //This recently changed: only fetch direction name, nothing else. $__stat->name = str_replace(" [NMBS/SNCB]", "", trim($att->Attribute->AttributeVariant->Text)); $directions[$k] = $__stat; $k++; } } if ($conn->Overview->Transfers > 0 && strcmp($connsection->Arrival->BasicStop->Station['name'], $conn->Overview->Arrival->BasicStop->Station['name']) != 0) { //current index for the train: j-1 $departDelay = 0; //Todo: NYImplemented $connarray = $conn->ConSectionList->ConSection; $departTime = tools::transformTime($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Time, $conn->Overview->Date); $departPlatform = trim($connarray[$connectionindex + 1]->Departure->BasicStop->Dep->Platform->Text); $arrivalTime = tools::transformTime($connsection->Arrival->BasicStop->Arr->Time, $conn->Overview->Date); $arrivalPlatform = trim($connsection->Arrival->BasicStop->Arr->Platform->Text); $arrivalDelay = 0; //Todo: NYImplemented $vias[$connectionindex] = new Via(); $vias[$connectionindex]->arrival = new ViaDepartureArrival(); $vias[$connectionindex]->arrival->time = $arrivalTime; $vias[$connectionindex]->arrival->platform = new Platform(); $vias[$connectionindex]->arrival->platform->name = $arrivalPlatform; $vias[$connectionindex]->arrival->platform->normal = 1; $vias[$connectionindex]->departure = new ViaDepartureArrival(); $vias[$connectionindex]->departure->time = $departTime; $vias[$connectionindex]->departure->platform = new Platform(); $vias[$connectionindex]->departure->platform->name = $departPlatform; $vias[$connectionindex]->departure->platform->normal = 1; $vias[$connectionindex]->timeBetween = $departTime - $arrivalTime; if (isset($directions[$k - 1])) { $vias[$connectionindex]->direction = $directions[$k - 1]; } else { $vias[$connectionindex]->direction = "unknown"; } $vias[$connectionindex]->vehicle = "BE.NMBS." . $trains[$j - 1]; $vias[$connectionindex]->station = connections::getStationFromHafasDescription($connsection->Arrival->BasicStop->Station['name'], $connsection->Arrival->BasicStop->Station['x'], $connsection->Arrival->BasicStop->Station['y'], $lang); $connectionindex++; } } } //check if there were vias at all if ($connectionindex != 0) { //if there were, lets calculate a URI for them $counter = 0; for ($counter = 1; $counter < sizeof($directions); $counter++) { if (isset($trains[$counter]) && isset($directions[$counter]) && isset($vias[$counter])) { $vias[$counter - 1]->departure->{"@id"} = connections::createDepartureURI($vias[$counter - 1]->station->{"@id"}, $trains[$counter], $directions[$counter]->name, $vias[$counter]->departure->time); } } //if there were vias, add them to the array $connection[$i]->via = $vias; } } $connection[$i]->departure->vehicle = "BE.NMBS." . $trains[0]; if (isset($directions[0])) { $connection[$i]->departure->direction = $directions[0]; $connection[$i]->departure->{"@id"} = connections::createDepartureURI($fromstation->{"@id"}, $trains[0], $directions[0]->name, $connection[$i]->departure->time); } else { $connection[$i]->departure->direction = "unknown"; } $connection[$i]->arrival->vehicle = "BE.NMBS." . $trains[sizeof($trains) - 1]; if (isset($directions[sizeof($directions) - 1])) { $connection[$i]->arrival->direction = $directions[sizeof($directions) - 1]; } else { $connection[$i]->arrival->direction = "unknown"; } $i++; } } else { throw new Exception("We're sorry, we could not retrieve the correct data from our sources", 2); } return $connection; }