валидная рсс-лента

Discussion in 'PHP' started by Дикс, 11 Feb 2009.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    сделал вот такую:
    PHP:
    <?php if(!defined('TRAZH')) die;
    header("Content-type: text/xml");
    echo 
    '<root><?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
    <channel>
    <title>The Даун Таун. Обитель Треша и Жести</title>
    <link>http://thedowntown.ru</link>
    <description>'
    .getPhrase('descr').'</description>
    <lastBuildDate>'
    .date('r'time()).'</lastBuildDate>
    <language>ru</language>'
    ;

    $res $db->query("SELECT title, alias, day, month, year, preview FROM trazh_creative ORDER BY tid DESC LIMIT 0, 30"1);

    if(
    $db->numRows)
    foreach(
    $res as $trazh){
        
    $pubTime date("r"mktime(000$trazh['month'], $trazh['day'], $trazh['year']));
        echo 
    '<item>
        <title>'
    .$trazh['title'].'</title>
        <link>http://thedowntown.ru/trazh/'
    .$trazh['alias'].'</link>
        <description>'
    .$trazh['preview'].'</description>
        <pubDate>'
    .$pubTime.'</pubDate>
        </item>'
    ;
    }


    echo 
    "</channel>\n</rss></root>";
    выводит:
    PHP:
      <root><?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
    <channel>
    <title>The Даун Таун. Обитель Треша и Жести</title>
    <link>http://thedowntown.ru</link>
    <description>Авторский проект Дикса о мёртвом городке Даун Таун и Науме.<br>Треш и жесть, упакованные
      в качественную литературную обёртку.<br> Психически неуравновешенным к прочтению не рекомендуется.</description>
    <lastBuildDate>Thu, 12 Feb 2009 00:39:53 +0600</lastBuildDate>
    <language>ru</language><item>
        <title>asdsadasdas</title>
        <link>http://thedowntown.ru/trazh/asds</link>
        <description>adsdasdas</description>
        <pubDate>Wed, 02 Apr 2008 00:00:00 +0600</pubDate>
        </item><item>
        <title>ТРИ</title>
        <link>http://thedowntown.ru/trazh/213123</link>
        <description>то в исходный код флэшки можно внедрить javascript, который при прямом доступе к флэшке исполнится, как и в IE, так и в Firefox'е. Это, конечно, разработчиками ВКонтакте учтено: прямой доступ к флэшке запрещен. Но флэшка сохраняется в кэше браузера, откуда ее можно загрузить без проблем.</description>
        <pubDate>Fri, 30 Nov 2007 00:00:00 +0600</pubDate>
        </item><item>
        <title>ДВА</title>
        <link>http://thedowntown.ru/trazh/213123g</link>
        <description>се вместе, да бы уменьшить бояновые темы в разделе. Все вопросы, касающиеся заливки шелла в Форуме, задаем сюда. Приветствуется помощь в наполнении темы актуальным материа</description>
        <pubDate>Fri, 30 Nov 2007 00:00:00 +0600</pubDate>
        </item><item>
        <title>Новый 2009</title>
        <link>http://thedowntown.ru/trazh/new2009</link>
        <description>Кучерявый сидел перед камином и читал книжку про лангольеров, когда неожиданно поднялся страшный ураган..</description>
        <pubDate>Mon, 01 Dec 2008 00:00:00 +0600</pubDate>
        </item></channel>
    </rss></root>
    если посылается хидер - Опера ругается:
    PHP:
    Ошибка разбора XML: синтаксическая ошибка (Строка: 1, Символ: 0)

    Обработать документ как HTML
    Ошибка:missing root element
    Описание:http://www.w3.org/TR/REC-xml/
      1:   <root><?xml version="1.0" encoding="UTF-8"?>
      2: <rss version="2.0">
      3: <channel>
      4: <title>The Даун Таун. Обитель Треша и Жести</title>
    пробовал убирать/добавлять <root> - эффекта нет.

    если хидер не посылать - просто белый экран. Но опера не предлагает подписаться на эту рсс-ленту, ничего.

    все файлы в utf-8 without BOM.
    опера подчёркивает первые два пробела красным - типа лишнее, не знаю как ещё от этих пробелов избавиться?
     
  2. CrazyStudentS_Mi}{

    CrazyStudentS_Mi}{ Elder - Старейшина

    Joined:
    4 Jul 2007
    Messages:
    424
    Likes Received:
    296
    Reputations:
    92
    возможно это поможет http://feedvalidator.org/
     
  3. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    581
    Reputations:
    256
    Дикс,
    убери root и проверь в другом браузере.
    Была у меня пару недель назад точно такая же задача и такая же ошибка. Оказалось это опера бажит (у меня 10). Часа 2 долбался. Открыл этот же фид в новой вкладке - все норм стало)
     
  4. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    не, в фф тоже самое.
     
  5. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    581
    Reputations:
    256
    Накатал такой скрипт - все пашет:
    PHP:
    <?php
    header
    ('Content-Type: application/rss+xml');
    $tmp = <<<XML
    <?xml version="1.0" encoding="UTF-8"?> 
    <rss version="2.0"> 
    <channel> 
    <title>The Даун Таун. Обитель Треша и Жести</title> 
    <link>http://thedowntown.ru</link> 
    <description>Авторский проект Дикса о мёртвом городке Даун Таун и Науме.<br/>Треш и жесть, упакованные 
      в качественную литературную обёртку.<br/> Психически неуравновешенным к прочтению не рекомендуется.</description> 
    <lastBuildDate>Thu, 12 Feb 2009 00:39:53 +0600</lastBuildDate> 
    <language>ru</language><item> 
        <title>asdsadasdas</title> 
        <link>http://thedowntown.ru/trazh/asds</link> 
        <description>adsdasdas</description> 
        <pubDate>Wed, 02 Apr 2008 00:00:00 +0600</pubDate> 
        </item><item> 
        <title>ТРИ</title> 
        <link>http://thedowntown.ru/trazh/213123</link> 
        <description>то в исходный код флэшки можно внедрить javascript, который при прямом доступе к флэшке исполнится, как и в IE, так и в Firefox'е. Это, конечно, разработчиками ВКонтакте учтено: прямой доступ к флэшке запрещен. Но флэшка сохраняется в кэше браузера, откуда ее можно загрузить без проблем.</description> 
        <pubDate>Fri, 30 Nov 2007 00:00:00 +0600</pubDate> 
        </item><item> 
        <title>ДВА</title> 
        <link>http://thedowntown.ru/trazh/213123g</link> 
        <description>се вместе, да бы уменьшить бояновые темы в разделе. Все вопросы, касающиеся заливки шелла в Форуме, задаем сюда. Приветствуется помощь в наполнении темы актуальным материа</description> 
        <pubDate>Fri, 30 Nov 2007 00:00:00 +0600</pubDate> 
        </item><item> 
        <title>Новый 2009</title> 
        <link>http://thedowntown.ru/trazh/new2009</link> 
        <description>Кучерявый сидел перед камином и читал книжку про лангольеров, когда неожиданно поднялся страшный ураган..</description> 
        <pubDate>Mon, 01 Dec 2008 00:00:00 +0600</pubDate> 
        </item></channel> 
    </rss>
    XML;
    die(
    $tmp);
    ?>
    Единственная проблема была с незакрытыми тегами br.
     
  6. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    558
    Likes Received:
    306
    Reputations:
    27
    2 Дикс перед root node не должно быть никаких выводов а я у тебя вижу пробел(или какой то непечатный символ)
    PHP:
     <root>
    все же попробуй сохранить этот скрипт в другом редакторе потому что ну очень похоже что идет Include Unicode Signature (BOM) или с Add Byte Order Mark.

    ну <![CDATA[]]> еше не кто не отменял, вроде.
     
    #6 AkyHa_MaTaTa, 12 Feb 2009
    Last edited: 12 Feb 2009
  7. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    странно.
    убрал "<?xml version="1.0" encoding="UTF-8"?>" всё отлично заработало.
    пример oRb также ругается, пока не уберёшь xml тег..

    с редактором проблем нет, я знаю что такое BOM, что пхп плохо с ним работает и всегда сохраняю без него. редактор это позволяет.

    за cdata спасибо :) на работе только сегодня его применял, а дома вечером чета совсем даже в голову не приходит :)
     
  8. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    558
    Likes Received:
    306
    Reputations:
    27
    Как то я сразу не посмотрел, вобшем по DTD структура валидного xml документа такова:
    PHP:
    <? пролога ?>
    <корневой элемент>

    </корневой элемент>
    то есть пролог <?xml version="1.0"?> должен идти да root node(корневого элемента(узла)) а у тебя наоборот, поставь впереди всего пролог и должно все работать.
     
    #8 AkyHa_MaTaTa, 12 Feb 2009
    Last edited: 13 Feb 2009
  9. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    у меня везде utf-8.
    в базе, в хтмл сайта, в посланных php хидерах, в сохранённых файлах со скриптами.
    достаточно я в своей жизни намучался с этими кодировками, поэтому теперь очень строго за этим слежу.
     
  10. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    да я ж его потом ваще удалил, рут там точно не нужен.
    PHP:
    <?xml version="1.0" encoding="UTF-8"?> 
    <rss version="2.0"> 
    <channel> 
    <title>The Даун Таун
    я не могу понять почему у меня всё работает без <?xml ?>, а с ней не работает??
     
  11. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    2Дикс
    Пролог (<?xml version="1.0" encoding="UTF-8"?> ) не является обязательным - поэтому и работает (хоте все же рекомендуется писать).
    А вообще почитай про well-formed xml-доки, думаю вопросы отпадут.