Почему фид не отображается в формате XML?

Здравствуйте. <br/><br/> Мы генерируем фиды с товарами с использованием стандартного функционала 1С-Битрикса, и они обновляются каждые 30 минут. Обычно с ними все в порядке, но иногда PHP интерпретирует файл как текст, что приводит к ошибкам при его открытии клиентами. Вы можете получить фид по <a href="https://wisell.ru/bitrix/catalog_export/megamarket.php" rel="nofollow">этой ссылке</a>. В данный момент мы фиксируем проблему. <br/><br/> Я сохранил версии файла: одна открывается <a href="https://disk.yandex.ru/d/Q1TLs0jPb7XrGw" rel="nofollow">как XML</a>, а другая <a href="https://disk.yandex.ru/d/8ApM2Gud2X9Xiw" rel="nofollow">как текст</a>. Я не нашел отличий между этими файлами. <br/><br/> На сервере фид хранится в формате PHP, но отдается как XML: <br/><pre><code class="php">$disableReferers = false;
if (!isset($_GET["referer1"]) || strlen($_GET["referer1"])&lt;=0) $_GET["referer1"] = "yandext";
$strReferer1 = htmlspecialchars($_GET["referer1"]);
if (!isset($_GET["referer2"]) || strlen($_GET["referer2"]) &lt;= 0) $_GET["referer2"] = "";
$strReferer2 = htmlspecialchars($_GET["referer2"]);
header("Content-Type: text/xml; charset=windows-1251");
echo "&lt;"."?xml version=\"1.0\" encoding=\"windows-1251\"?"."&gt;"?&gt;
&lt;!DOCTYPE yml_catalog SYSTEM "shops.dtd"&gt;
&lt;yml_catalog date="2024-11-29 09:06"&gt;
&lt;shop&gt;
&lt;name&gt;wisell.ru&lt;/name&gt;
&lt;company&gt;wisell.ru&lt;/company&gt;
&lt;url&gt;https://wisell.ru&lt;/url&gt;
&lt;platform&gt;1C-Bitrix&lt;/platform&gt;
&lt;currencies&gt;
&lt;currency id="RUB" rate="1" /&gt;
// ... ...</code></pre><br/><br/> Можете помочь разобраться с этой проблемой? Спасибо.
  • 29 ноября 2024 г. 4:03
Ответы на вопрос 2
Здравствуйте!

Проблема, с которой вы столкнулись, может быть связана с несколькими факторами, особенно если один файл отображается корректно, а другой — нет. Вот несколько шагов, которые могут помочь вам разобраться и решить проблему:

1. **Проверка кода вывода**: Убедитесь, что перед выводом содержимого XML нет пробелов или других символов. Например, не должно быть никаких пробелов перед `<?xml` в начале файла. Если до этого тега есть какие-либо символы (включая пробелы, символы новой строки или ошибки PHP), это может привести к неправильной интерпретации содержимого.

2. **Корректная кодировка**: Убедитесь, что файл корректно сохранен в текстовом формате Windows-1251. Если файл сохранен в другой кодировке (например, UTF-8), это может привести к проблемам на стороне клиента.

3. **Заголовки HTTP**: В вашем коде заголовок `Content-Type` установлен правильно, но убедитесь, что нет других заголовков, которые могут перезаписывать этот параметр. Вам следует проверить, не выводятся ли какие-либо дополнительные заголовки или содержимое до установки `Content-Type`.

4. **Логи ошибок**: Просмотрите логи ошибок на сервере. Возможно, там есть подсказки, указывающие на проблемы в коде или конфигурации сервера.

5. **Проблемы на стороне клиентов**: Возможно, проблема возникает из-за того, как клиенты обрабатывают ваш фид. Убедитесь, что клиенты не накладывают дополнительные ограничения или фильтры к запросу, которые могут повлиять на ответ.

6. **Проверка фида**: Используйте валидатор XML для проверки вашего фида на наличие ошибок. Иногда проблемы с форматированием, такие как неправильные символы или категория с некорректными данными, могут привести к сбоям.

7. **Сравнение файлов**: Если у вас есть две версии файла, попробуйте сравнить их оба, не только по видимому содержимому, но и с использованием инструментов сравнения файлов, чтобы выявить невидимые различия, такие как разное количество пробелов, знаков переноса строк и т. д.

Если после всех этих попыток проблема все еще сохраняется, постарайтесь детализировать ситуацию, и мы можем продолжить искать решение.
1. Гуглим simplexml_load_string ошибки 
2. Открываем страницу https://www.php.net/manual/ru/simplexml.examples-e...
3. Берём с неё код и немного модицифируем

libxml_use_internal_errors(true);

$sXML = download_page($url);
$xml = simplexml_load_string($sXML);

if ($xml === false) {
    throw new RuntimeException(
        "XML parsing errors: ". implode("", array_column(libxml_get_errors(), 'message'))
    );
}


Смотрим ошибки, исправляем.
Похожие вопросы