Конвертирование XML в JSON на PHP 8

Доброго времени суток! В данной статье мы рассмотрим с Вами, как можно создать простой сервис, единственной задачей
которого будет конвертирование xml файла в json. Сервис будет принимать ссылку на XML файл и возвращать преобразованный
ответ в формате JSON
. Где это может пригодиться? Например, с помощью данного простого сервиса я сделал преобразование
RSS ленты, которая представляет из себя XML, в JSON формат на сервере, ответ с которого потом передавался в Android
приложение
и выводился пользователю в интерфейсе.

Итак, приступим к коду. Основной функционал сервиса будет находиться в файле functions.php.


<?php

declare(strict_types=1);

// отформатированный вывод json
function util_json(mixed $value): bool|string
{
    return json_encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}

// CORS заголовки, чтобы можно было запрашивать сервис посредством fetch в браузере
function cors(): void
{
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
    header('Content-Type: application/json');
}

// отформатированный код ответа при ошибке
function error_response(string $message, int $code = 501): bool|string
{
    $responseMessage = ['code' => $code, 'error' => $message];
    return util_json($responseMessage);
}

/**
 * Сам конвертер - центральный элемент сервиса
 * 
 * @throws Exception
 */
function convertXml2Json(string $xmlUrl): bool|string
{
    // пытается загрузить ресурс по ссылке и преобразовать
    $element = @simplexml_load_file($xmlUrl, options: LIBXML_NOCDATA);

    // если ссылка не может быть загружена или возникла какая-то другая проблема - бросаем исключение
    if(!$element) {
        throw new Exception('Unable to parse xml resource from ' . $xmlUrl);
    }

    // форматируем в json
    return util_json($element->channel);
}

// обработчик запроса от клиента
function process_request(array $request_data, string $apiKey): string|bool
{
    $response_text = '';

    try {
        // если запрос содержит ключ авторизации и он равен нашему ключу $apiKey
        if($request_data['key'] === $apiKey)
        {
            // если в запросе передан правильный url ресурса
            if(!empty($request_data['resource']) && (filter_var($request_data['resource'], FILTER_VALIDATE_URL) !== false))
            {
                // выполняем конвертацию
                $response_text = convertXml2Json($request_data['resource']);
            }
            else
            {
                $response_text = error_response('Invalid url of xml resource');
            }
        }
        else
        {
            $response_text = error_response('Wrong access key');
        }

    }
    catch (Exception $e) {
        $response_text = error_response($e->getMessage());
    }

    return $response_text;
}

Файл index.php


<?php

require_once ('functions.php');

$url = "https://news.yandex.ru/internet.rss";
$apiKey = "API_KEY";

// данный запроса: resource -> url, key -> key
$mockGET = ['resource' => $_GET['url'] ?: $url, 'key' => $_GET['key']];

// отправляем заголовки
cors();
// и результат
print process_request($mockGET, $apiKey);

Протестировать на локальном ПК можно так:


php -S localhost:8080 index.php

Открываете в браузере адрес:


http://localhost:8080/?key=API_KEY

В результате получим JSON представление XML ресурса. Дальше этот сервис можно разместить на хостинге, например,
и использовать его в других приложениях.

Источник