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

Чтение RSS 2.0

  • Z-MODe

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

    Spritz 5 мая 2008 г. 11: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 &quot;<b>title:</b>&quot;.iconv(&#39;UTF-8&#39;,&#39;cp1251&#39;,$reader->value).&quot;<br />&quot;;
    }
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == &#39;description&#39;) {$reader->read();
    print &quot;<b>description:</b>&quot;.iconv(&#39;UTF-8&#39;,&#39;cp1251&#39;,$reader->value).&quot;<br />&quot;;
    }
    if ($reader->nodeType == XMLREADER::ELEMENT AND $reader->localName == &#39;link&#39;) {$reader->read();
    print &quot;<b>link:</b>&quot;.iconv(&#39;UTF-8&#39;,&#39;cp1251&#39;,$reader->value).&quot;<br />&quot;;
    }

    }
    }

    }


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

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

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

    http://beshenov.ru/rss2.html


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    }
  • Z-MODe

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

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

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

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


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

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

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

    Тебе надо &quot;channel -> language&quot; или &quot;xml lang&quot;? То есть язык канала или xml доки? Я говорил тебе о языке канала.
    adw/0
  • ghost

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

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

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

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


  • Z-MODe

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

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

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

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

    $arr = array();

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

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

    var_dump($arr);


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

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

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

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


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

    }


  • Z-MODe

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

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

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

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

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

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

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