Наверх

Ошибка синтаксического анализа XML. Лечение.

Автор kbaott, 28.06.2011 | Просмотров: 29 161 |

Здравствуйте, как видите блог немного обновился, стал веселее и ярче. Наконец-то у меня дошли руки и до блога, давно хотел добавить в функционал несколько фич. Ну с ними Вы разберетесь как-нибудь сами, а пока я расскажу о небольшой неприятности. Сегодня заметил, что не работает ни один фид на блоге. Вообще ни один: ни RSS 0.92, ни RSS 2.0 ни RDF и даже ATOM не захотел работать. На все мои вопросы браузер отвечал одним и тем же окном:

К слову сказать я, как правило, пользуюсь браузером Mozilla Firefox 4.0.1, очень редко Opera 11.11, ну совсем редко Internet Explorer 9 (ну даже не пользуюсь, а скорее тестирую). «Мозиллой» пользуюсь для работы и серфинга, а остальными двумя проверяю как выглядят мои сайты в них. Другими браузерами не пользуюсь так как не вижу в этом смысла, для проверки совместимости есть browsershots.org, а более старые версии просто неактуальны, всем не угодишь. Как по мне, так пользователю лучше обновить (как правило бесплатно) браузер, чем искать сайт который нормально отображается в его Опере пятилетней давности.  В общем, не в этом суть. А в том, что средствами Мозиллы я так и не смог просмотреть свои фиды. Сразу же пошел гуглить на эту тему. И нагуглил довольно много информации — о проблемах с RSS не писал только ленивый паралитик. Особо распылятся я не буду, а только кратко пробегусь по методам борьбы с ошибками RSS. Но сначала немного теории. Ленты RSS и им подобные написаны на языке XML, а не HTML, а XML никогда не прощает ни единой ошибки в коде, как это бывает в случае с HTML. В отличие от HTML, DOM анализатор обязан отказаться от разбора XML документа, если в документе есть ошибки. Поэтому проверять свой RSS на валидность просто необходимо. При попытке открыть ленту с багами в синтаксисе пользователь как правило видит ругню браузера. Поэтому ошибки в коде RSS Feed недопустимы. Для выявления этих ошибок есть Feed-валидаторы: http://feedvalidator.org и http://validator.w3.org, но о них позже.

Я как раз собрался «прожечь» свой фид через FeedBurner, который, как известно, не терпит ошибок в фидах: если он обнаруживает в ленте ошибку, то отказываться его принимать и говорить, что «Вы подсунули ему что угодно, но только не RSS-ленту». Я то собрался прожечь, а тут как назло эти ошибки. «Значит будем их исправлять!» — гордо подумал я и… осекся. Почему, понятнее станет в самом конце поста.

Расскажу о самых распространенных проблемах с фидами. Первой из них является «Ошибка синтаксического анализа XML». Часто советуют отключить в WordPress все плагины изменяющие параметры RSS, но это «wooden leg massage», это никогда не помогает. Далее, проблемой может быть наличие пустых строк после «?>» в php-файлах как отвечающих за фиды, так и в файлах движка и поагинов. Решением может быть плагин Fix RSS Feed 3.0 для WordPress, который помогает исправить ошибки RSS фидов такие, как: “Error on line 2: The processing instruction target matching “[хХ][мМ][LL]” is not allowed.” когда вы пытаетесь прожечь свой RSS Feed через FeedBurner, или ошибка “XML or text declaration not at start of entity” которая появляется в браузере FireFox, или ошибка, которая возникает в браузере Opera “XML declaration not at beginning of document” и т.д. Качаете плагин, устанавливаете любым удобным способом, активируете, теперь в админпанели в меню «Парамерты» вібираем «Fix RSS Feed», ставим переключатель в None (нечего с нас честных блоггеров за чепуху баксы требовать), нажимаем «Fix wordpress rss feed errors» (предварительно нужно установить chmod 777 на файл wp-blog-header.php). Если ошибки были, то они исправлены плагином. Если вдруг что пойдет не так, то можно восстановить все измененные файлы (Restore fix). Мне этот плагин не помог.

Вторая возможная проблема и ее решение: BOM (п>ї). Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого в кодировке UTF-8. Поскольку любимый WordPress живет именно в этой кодировке, не часто, но в структуру его файлов эти символы попадают. Причем, они могут попадать не обязательно в файлы фидов, даже если они затесались в файлик какого-то плагина, RSS уже может показаться FeedBurner’у верхом непристойности. Выискать такие файлы вручную невозможно, поэтому нужно обратиться к средствам автоматизации, а именно к скрипту поиска ВОМ’ов — Find BOM. Разархивируйте в корень сайта (туда где лежит файл wp-config.php), далее в строке адреса из админки введите http://вашсайт/find_bom.php в итоге по окончанию сканирования файлов скрипт выдаст список негодяев, в теле которых живут ВОМ’ы. Удалить их теперь не сложно — выкачиваем на локальный компьютер, скачиваем актуальную версию редактора Notepad ++ (никаких Блокнотов!), открываем в нем найденные файлы, выбираем из меню «Кодировки» пункт «Преобразовать в UTF-8 без ВОМ» — это стопроцентно вылечит файл от ВОМ, сохраняем, заливаем обратно. И этот скрипт мне не помог, навязчивое желтое окно висело…

Третий вариант — «Тяжелая артиллерия». Заходим через FTP менеджер в каталог wp-includes, и открываем в любом редакторе, который корректно работает с кодировкой  UTF-8 без BOM (например  Notepad++), файлы: «feed-rss.php», «feed-rss2.php», «feed-rss2-comments.php», «feed-atom.php», «feed-rdf.php».В начале каждого из них находим строчку:

<code>&lt;?php
echo '&lt;?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'&gt;';
?&gt;</code>

и жестоко  удаляем ее. Изменения во всех указанных файлах ни к чему не привели: «(С) А воз и ныне там».

Четвертый вариант — «На грубость нарываешься». Наш путь снова лежит в каталог wp-includes, там берем и редактируем файлы feed-rss2.php и feed-rss2-comments.php. В файле убираем первые 13-14 строк (у кого как) вплоть до <rss version=»2.0″ …… К сожалению и это не помогло. Я уже начал отчаиваться и вдруг нахожу еще один способ.

Пятый способ — «Бредни пьяного саппорта». На каком-то забугорном сайте нашел я такой text:

What we need, is to add a little tip in specific files where wordpress feeds are made up before to be outputted to the browser on request. So, we go to fix this by opening the follow file, if the feed we want is RSS2 in wordpress (we will see all any other after in any case):
wp-includes/feed-rss2.php
open it with a text editor and read on the very top section, the following code:

header(‘Content-Type: text/xml; charset=’ . get_option(‘blog_charset’), true);
$more = 1;

To fix the feed on wordpress (but not only, it is obviously valid in, and for, any other feed or non feed contest where we can have the same necessity), add this tricky Php code immediately after:

$out = ob_get_contents();
$out = str_replace(array(“\n”, “\r”, “\t”, ” “), “”, $input);
ob_end_clean();

Do the same almost with the comment’s feed file: feed-rss2-comments.php
Save/replace the feed-rss2.php and the feed-rss2-comments.php files modified in this way and enjoy your re-enabled feeds!

Короче, в файлы фидов нужно добавить три строчки кода, на некоторых сайтах басурманы кричат, что помогает. Мне… не помогло.

Сижу, я расстроенный, чуть не плачу. Потихоньку открываю один за одним файлы движка, просматриваю код плагинов, а что еще делать, гуглование… гугление… гугловство не помогло — одни и те же копипасты, ничего нового. Нервы на пределе. И тут я просто так, ради шутки авторизуюсьна FeedBurner’е и предлагаю ему скушать прожечь мой фид — и, о чудо, он его принимает и принимаеться предлагать мне всяческие настройки! На радостях пытаюсь своими куриными мозгами понять «а чё ваще?». Непонимание переходит в недоумение. Хватаю несколько фирменных фич FeedBurner’а, несу их на бог, проверяю — работают!

Иду на вышеуказанные фид-валидаторы, проверяю и… зарабатываю кнопку «This is a valid RSS feed«. То бишь это валидный RSS-канал, кроме одной ошибки и то из-за невалидного embed-кода электронного журнала, которые не играет никакой роли. Проверяю в «Опере» и «Ослике» — работает все и RSS, и ATOM. Думал долго. Оказалось нужна была кнопка браузера Mozilla Firefox — «Стереть недавнюю историю…«.

Лента заработала после применения одного из перечисленных способов лечения. Но вот после какого? И почему вылезла ошибка? Не скажет, уже наверное, никто. Как говориться, «за больной головой и рукам нет покоя». Все это оказалось очень напряжным, но зато я изучил все аспекты rss-терапии.

Вместо эпилога:

На картриджах NES(Dendy) тоже стояли защиты, которые делали сложность игры невменяемой, если игра обнаруживала, что её взломали и запустили на не оригинальной NES. А так как на пост советском пространстве оригинальных NES вообще не было, то такие игры, как «Teenage Mutant Ninja Turtles 2» мы проходили, даже не зная, что разработчики считали их не проходимыми.

Метки: , , , ,
Писано 28.06.2011

Понравилась статья? Тогда получайте обновления на e-mail: