Ошибка вывода XML в PHP: «XML или текстовое объявление не в начале объекта» - PullRequest
3 голосов
/ 13 июня 2011

Я использую версию PHP> 5.2 (5.2.17 на моем веб-сервере и 5.3.6 на моем локальном хосте) со следующими настройками:

output_buffering = On
output_handler = ob_gzhandler

В следующем сценарии PHP я выводлюXML-ответ для использования с jQuery / AJAX

if (empty($_GET))
{
    $Response = new Response('getlanguage');
    $Response->DisplayLanguage(LanguagesManager::GetLanguage());
    die();
}

IOManager::InputSanitizeRequest($_GET);
$Language = isset($_GET['language']) ? $_GET['language'] : '';

$Response = new Response('setlanguage');

if (LanguagesManager::ValidateLanguage($Language))
{
    LanguagesManager::SetLanguage($Language);
    $Response->DisplayResult(true);
}
else
    $Response->DisplayResult(false);

Но моя функция jQuery / AJAX не работает, и, если я пытаюсь вручную проверить вывод моего сценария PHP, я получаю следующую ошибку в Mozilla Firefox:

XML Parsing Error: XML or text declaration not at the start of entity
Address: http://127.0.0.1/responses/requestlanguage.php?language=it
Line Number 1, Column 2: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-^

И это вызвано завершающими пробелами перед объявлением XML:

" <?xml version="1.0" encoding="UTF-8" standalone="yes"?>"

Я проверил свои теги PHP и все в порядке.Немного поработав с моим кодом, я обнаружил нечто невероятное: пробел создается этой функцией:

LanguagesManager::ValidateLanguage($Language)

public static function ValidateLanguage($Language)
{
    return in_array($Language, self::GetSupportedLanguages());
}

Если я комментирую весь оператор if или я заменяю эту функцию простым "true "Я больше не получаю ошибку разбора ... ну, я просто не могу поверить в это.Может кто-нибудь объяснить мне, почему?Кто-нибудь знает решение?

1 Ответ

0 голосов
/ 13 июня 2011

Если вы не нашли ошибку, вы можете попытаться перехватить пространство с помощью буферизации вывода, например:

ob_start();
// here the code part, which seems to print the whitespace (but nothing else)
$langValidated = LanguagesManager::ValidateLanguage($Language);
ob_end_clean();

if ($langValidated)
{
    LanguagesManager::SetLanguage($Language);
    $Response->DisplayResult(true);
}
else
    $Response->DisplayResult(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...