summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2008-10-22 20:24:22 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2008-10-22 20:24:22 +0000
commit632f27097a17d5b90f0f669469365a4f142cffa5 (patch)
treecad37072bb61d42372ef50f56b91248931627505 /includes
parent88c75b81d8a739d2a088cd6249ebe001b57bc43f (diff)
downloadwebsite-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.
Diffstat (limited to 'includes')
-rw-r--r--includes/news.php106
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>';
}
+
?>