ФорумПрограммированиеPHP для идиотов → Чтение RSS 2.0

Чтение RSS 2.0

  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 5 мая 2008 г. 22:39

    Надо прочитать РССку

    Вот на что у меня хватило мозгов((

    $reader = new XMLReader();
    $reader->open('http://www.alcatel-lucent.com/wps/ALURSSServlet?query=doctype+%3D+%7Edq%7ENews_Releases%7Edq%7E&collectionIDs=allunews');

    while($reader->read()){
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'item') {
    while($reader->read()) {

    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'title') {$reader->read();
    print "<b>title:</b>".iconv('UTF-8','cp1251',$reader->value)."<br />";
    }
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'description') {$reader->read();
    print "<b>description:</b>".iconv('UTF-8','cp1251',$reader->value)."<br />";
    }
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'link') {$reader->read();
    print "<b>link:</b>".iconv('UTF-8','cp1251',$reader->value)."<br />";
    }

    }
    }

    }


    Всё по сути хорошо РСС читается, НО лента вещается на разных языках, необходимо изъять из неё итемы только с русским дескрипшином…
    Дальше не знаю…
    Глянул дум, но там с этим вообще дебри(((
    Пробовал MagpieRSS, но она сразу мне сказала, что не будет читать эту РСС ;)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 5 мая 2008 г. 23:21, спустя 41 минуту 42 секунды

    http://beshenov.ru/rss2.html


    language - Язык, на котором написан канал. Позволяет сборщикам, к примеру, объединить на одной странице все сайты на итальянском. Перечень допустимых значений элемента, предоставленный Netscape — http://www.rssboard.org/rss-language-codes. Также можно использовать значения, определенные W3C.
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 5 мая 2008 г. 23:26, спустя 5 минут 48 секунд

    Вот в том то и проблема что канал написан на разных языках…
    И о том на каком языке новость можно узнать только в <description> например <description xml:lang="ru-ru">
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 5 мая 2008 г. 23:27, спустя 52 секунды

    проще всего предположить что в титле будет хотяб одно русское слово длиннее 2-х символов и пробить регуляркой типа /[а-я]{3}/is
    а, блин.. да в дискрипшине же есть.. торможу под вечер, из него и вытягивай
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 5 мая 2008 г. 23:36, спустя 8 минут 22 секунды

    угу.. как вытягивать??? как мне туда пробится, а потом назад вернуться?
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 5 мая 2008 г. 23:44, спустя 8 минут 43 секунды

    XMLReader::getAttribute('xml:lang') если я не ошибаюсь.. ваще дум юзаю.
    или просто lang
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 6 мая 2008 г. 0:16, спустя 31 минуту 38 секунд

    Помогите пожалуйста правильно и в нужном месте условие воткнуть…
    XMLReader::xmlLang == "ru-ru"
    чёто вообще сообразить не могу=(
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 6 мая 2008 г. 0:25, спустя 8 минут 39 секунд

    что-нить в этом роде

    $reader = new XMLReader();
    $reader->open('http://www.alcatel-lucent.com/wps/ALURSSServlet?query=doctype+%3D+%7Edq%7ENews_Releases%7Edq%7E&collectionIDs=allunews');

    while($reader->read()){
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'item') {
    $toPrint = false;
    while($reader->read()) {

    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'title') {
    $reader->read();
    if (XMLReader::xmlLang == "ru-ru" ) {$toPrint=true;}
    $title = "<b>title:</b>".iconv('UTF-8','cp1251',$reader->value)."<br />";
    }
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'description') {$reader->read();
    $desc = "<b>description:</b>".iconv('UTF-8','cp1251',$reader->value)."<br />";
    }
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == 'link') {$reader->read();
    $link = "<b>link:</b>".iconv('UTF-8','cp1251',$reader->value)."<br />";
    }

    }
    if ($toPrint){печатаешь всё что надо..}
    }

    }
  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 6 мая 2008 г. 0:39, спустя 14 минут 20 секунд

    Ну я думаю что надо условие это тогда под дескриппшином ставить, но всё равно не срабатывает… и цикл срывается…

    Да и не печатать мне это надо а в массивы записать.. что бы потом на шаблон запарсить…


    А если на думе? может подскажешь? там же вроде как раз сначало прочитаешь а потом как по дереву лазиешь..
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 6 мая 2008 г. 0:59, спустя 19 минут 39 секунд

    Тебе надо "channel -> language" или "xml lang"? То есть язык канала или xml доки? Я говорил тебе о языке канала.
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • ghost

    Сообщения: 883 Репутация: N Группа: Джедаи

    Spritz 6 мая 2008 г. 1:03, спустя 4 минуты 40 секунд

    через SimplXML
    	$arr = array()
    $sx = simplexml_load_file('…………..');
    $kNode = $sx->channel;

    foreach ($node->children() as $ch) {
    if($ch->description['xml:lang'] !="ru-ru" ) continue;
    $arr[] = array('title'=>$ch->title, 'description'=>$ch->description, 'link'=>$ch=>link);
    }


  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 6 мая 2008 г. 1:23, спустя 19 минут 27 секунд

    adw0rd, Я понял о чём ты говоришь.. нет не язык канала, а язык отдельно взятого итема

    ghost, после некоторых ругательств получил это, проверь плиз всё так?

    $arr = array();

    $sx = simplexml_load_file('А тут ссылку можно? или мне в отдельный файл всё выкачать?');
    $kNode = $sx->channel;

    foreach ($kNode->children() as $ch) {
    if($ch->description['xml:lang'] !="ru-ru" ) continue;
    $arr[] = array('title'=>$ch->title, 'description'=>$ch->description, 'link'=>$ch->link);
    }

    var_dump($arr);


    В ответ получаю : array(0) { }
    (((
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 6 мая 2008 г. 12:42, спустя 11 часов 19 минут 3 секунды

    Короче, юзай XPath и SimpleXML
    Что-то типа


    $results = $xml->xpath('//item[@xml:lang=ru-ru]'); // Извлечь все теги item, у которых атрибут xml:lang равен ru-ru
    foreach($results as $result)
    {

    }


  • Z-MODe

    Сообщения: 199 Репутация: N Группа: Кто попало

    Spritz 6 мая 2008 г. 13:12, спустя 30 минут 10 секунд

    В том то и дело что язык не в итеме прописан, а в дескрипшине, или всё равно прокатит?
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 6 мая 2008 г. 13:21, спустя 8 минут 34 секунды

    Ну я же не вижу исходного XML,
    но с помощью XPath запросов можно извлечь практически любую группу тегов.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!