Парсинг RSS через DOM XML

encyclop

Guest
Парсинг RSS через DOM XML

Привет всем и с наступлением летнего сезона!

Хочу наладить парсинг RSS через DOM XML (http://ru.php.net/domxml), но столкнулся с двумя проблемами:

1. не парсятся xml-файлы, где у нити rss есть "атрибут" xmlns.

Пример:

<rss version="2.0" xmlns="http://some.server.com/dir">

Как атрибут у rss его нельзя взять ни по отдельности get_attribute_node, get_attribute), ни в группе (attributes), ни тем более его изменить, ни удалить (remove_attribute)

Вопрос: как его убрать? Через DOM XML, разумеется...

Если вы у нить rss была в виде

<rss version="2.0">

все было бы отлично (почти).

2. При получении пропарсенных файлов (удалении вручную куска xmlns на тестируемом файле) данные собираются в умопомрачительной кодировке и это при том, что документу предшествует строчка

<?xml version="1.0" encoding="windows-1251"?>

Пример:

Крепи дисциплину трудом!

...будет как...

Крепи дисциплину трудом!

Заранее спасибо.
 

slach

Новичок
1) эта умопомрачительная кодировка назыается UTF-8
она кстати базовая для XML ... и DOMXML (libxml) в частности... она используется для представления данных

смотри в сторону http://php.net/manual/en/ref.iconv.php

2) насчет namespace'ов это не АТРИБУТЫ =) как ты надеюсь понимаешь ... кури мануал вот тут, думаю поможет
http://www.php.net/manual/en/function.domdocument-create-element-ns.php
 

Three Daws

Guest
не надо налаживать парсинг RSS через DOM XML!

в данном случае достаточно проанализировать и разобрать XML-документ на основе событий (SAX), а не на основе деревьев, как это принято в DOM XML.

См. http://www.php.net/manual/ru/ref.xml.php

-~{}~ 01.06.04 14:29:

Кстати, пример обработки RSS-рассылки на основе событий по Скляру и Трахтенбергу:
PHP:
<?php
$xml = xml_parser_create();
$rss = new pc_RSS_parser;

xml_set_object($xml, $rss);
xml_set_element_handler($xml, 
                       'start_element', 'end_element');
xml_set_character_data_handler($xml, 'character_data');
xml_parser_set_option($xml,
                       XML_OPTION_CASE_FOLDING, false);

$feed = 'http://pear.php.net/feeds/latest.rss';
$fp = fopen($feed, 'r') 
            or die("Can't read RSS data.");

while ($data = fread($fp, 4096)) {
  xml_parse($xml, $data, feof($fp)) 
            or die("Can't parse RSS data");
}       
fclose($fp);

xml_parser_free($xml);

// интерфейс доступа к отдельному элементу
class pc_RSS_item {

  var $title = '';
  var $description = '';
  var $link = '';

  function display() {
    printf('<p><a href="%s">%s</a><br />%s</p>',
            $this->link,htmlspecialchars($this->title),
            htmlspecialchars($this->description));
  }
}

// класс обработчика рассылки
class pc_RSS_parser {
  
  var $tag;
  var $item;
  
  function start_element($parser, $tag, $attributes) {
    if ('item' == $tag) {
      $this->item = new pc_RSS_item;
    } elseif (!empty($this->item)) {
      $this->tag = $tag;
    }
  }
  
  function end_element($parser, $tag) {
    if ('item' == $tag) {
      $this->item->display();
      unset($this->item); 
    }
  }
  
  function character_data($parser, $data) {
    if (!empty($this->item)) {
      if (isset($this->item->{$this->tag})) {
        $this->item->{$this->tag} .= trim($data);
      }
    }
  }
}  

?>
 
Сверху