diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2008-10-22 20:24:22 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2008-10-22 20:24:22 +0000 |
commit | 632f27097a17d5b90f0f669469365a4f142cffa5 (patch) | |
tree | cad37072bb61d42372ef50f56b91248931627505 | |
parent | 88c75b81d8a739d2a088cd6249ebe001b57bc43f (diff) | |
download | website-632f27097a17d5b90f0f669469365a4f142cffa5.tar.gz website-632f27097a17d5b90f0f669469365a4f142cffa5.tar.bz2 website-632f27097a17d5b90f0f669469365a4f142cffa5.tar.xz website-632f27097a17d5b90f0f669469365a4f142cffa5.zip |
Reimplemented the news RSS parsing with PHP5's XMLReader
Quite a bit of code... maybe I'm doing something wrong? In any case, it works.
-rw-r--r-- | includes/news.php | 106 |
1 files changed, 78 insertions, 28 deletions
diff --git a/includes/news.php b/includes/news.php index f064b62..e1c5311 100644 --- a/includes/news.php +++ b/includes/news.php @@ -11,41 +11,90 @@ // //$feedurl = "http://sourceforge.net/export/rss2_projnews.php?group_id=106790&rss_fulltext=1"; + $feedurl = "includes/rss2_projnews.cache"; -if (!$dom = domxml_open_file($feedurl)) { - echo "Error while opening news feed.\n"; +$xml = new XMLReader(); + +if (!$xml) { + echo "Error, no XMLReader.\n"; exit; } -$root = $dom->document_element(); -$rootchilds = $root->child_nodes(); +$xml->open($feedurl); +xml_read_rss($xml); +$xml->close(); + +function xml_read_rss($xml) +{ + if ($xml->next("rss")) { + xml_read_channels($xml); + } else { + echo "Error, not an rss feed."; + } +} + +function xml_read_channels($xml) +{ + while ($xml->read()) { + switch ($xml->nodeType) { + case XMLReader::ELEMENT: + if ($xml->name == "channel") { + xml_read_channel($xml); + } else { + xml_read_unknown_element($xml); + } + break; + case XMLReader::END_ELEMENT: + return; + } + } +} + +function xml_read_channel($xml) +{ + while ($xml->read()) { + switch ($xml->nodeType) { + case XMLReader::ELEMENT: + if ($xml->name == "item") { + xml_read_item($xml); + } else { + xml_read_unknown_element($xml); + } + break; + case XMLReader::END_ELEMENT: + return; + } + } +} + +function xml_read_item($xml) +{ + $newsdata = array(); -foreach ($rootchilds as $rootchild) + while ($xml->read()) { + switch ($xml->nodeType) { + case XMLReader::ELEMENT: + $newsdata[$xml->name] = $xml->readString(); + xml_read_unknown_element($xml); + break; + case XMLReader::END_ELEMENT: + print_news_item($newsdata); + return; + } + } +} + +function xml_read_unknown_element($xml) { - if ($rootchild->tagname == "channel") - { - $channelchilds = $rootchild->child_nodes(); - - foreach ($channelchilds as $channelchild) - { - if ($channelchild->tagname == "item") - { - $itemchilds = $channelchild->child_nodes(); - $newsdata = array(); - - foreach ($itemchilds as $itemchild) - { - if (strlen($itemchild->tagname) > 0) - { - $newsdata[$itemchild->tagname] = - $itemchild->get_content(); - } - } - - print_news_item($newsdata); - } - } + while ($xml->read()) { + switch ($xml->nodeType) { + case XMLReader::ELEMENT: + xml_read_unknown_element($xml); + break; + case XMLReader::END_ELEMENT: + return; + } } } @@ -57,4 +106,5 @@ function print_news_item($newsdata) echo '<div class="news_body"><p>' . $newsdata['description'] . '</p></div>'; echo '</div>'; } + ?> |