filterXPath('//leistungen/leistung') ->each(function (Crawler $node) use (&$availabilities) { $availability = new Availability(); $availability->serviceId = (int) $node->attr('id'); $availability->status = $node->attr('status'); $availability->available = (int) $node->attr('frei'); $availability->price = $this->stringToFloat($node->attr('preis')); $availabilities[$availability->serviceId] = $availability; }) ; // Parse travel-level booking status from node $allowedBookingStatus = []; $travelStatus = null; $reiseNode = $result->filterXPath('//reise'); if ($reiseNode->count() > 0) { $travelStatus = $reiseNode->attr('status'); $bookingStatusPossible = $reiseNode->attr('buchungstatusmoeglich') ?? ''; if ('' !== $bookingStatusPossible) { $allowedBookingStatus = str_split($bookingStatusPossible); } } return new ServiceAvailabilityResponse($availabilities, $allowedBookingStatus, $travelStatus); } public function parseRooms(Crawler $result): BaseData { $availabilities = []; $result ->filterXPath('//unterbringungen/unterbringung') ->each(function (Crawler $node) use (&$availabilities) { $room = new Room(); $room->id = (int) $node->attr('id_zimmer'); $room->label = (string) $node->attr('bezeichnung'); $room->category = (string) $node->attr('kategorie'); $room->board = (string) $node->attr('verpflegung'); $room->available = (int) $node->attr('frei'); $room->status = (string) $node->attr('status'); $room->price = $this->stringToFloat($node->attr('preis')); $availabilities[$room->id] = $room; }) ; return new BaseData($availabilities); } }