Click to See Complete Forum and Search --> : RSS Parsing


Cipher
02-15-2006, 04:12 PM
Hi Php developers,

I have this script to parse RSS feed, and it works succefully, the problem i had is that i needed to use the same script twise in the same page, with ofcourse different RSS feed, when i tried that it gave me this error:

Fatal error: Cannot redeclare startelement() (previously declared in c:\inetpub\wwwroot\cipherdeveloper\internetnews_parser.php:17) in c:\inetpub\wwwroot\cipherdeveloper\devshed_parser.php on line 17

i use include"file" to include the parser into my page, here's the Script:
<?php

/*
Created by Global Syndication's RSS Parser
http://www.globalsyndication.com/rss-parser
*/

set_time_limit(0);

$file = "http://www.internetnews.com/icom_includes/feeds/inews/wr-dev-news-10.xml";

$rss_channel = array();
$currently_writing = "";
$main = "";
$item_counter = 0;

function startElement($parser, $name, $attrs) {
global $rss_channel, $currently_writing, $main;
switch($name) {
case "RSS":
case "RDF:RDF":
case "ITEMS":
$currently_writing = "";
break;
case "CHANNEL":
$main = "CHANNEL";
break;
case "IMAGE":
$main = "IMAGE";
$rss_channel["IMAGE"] = array();
break;
case "ITEM":
$main = "ITEMS";
break;
default:
$currently_writing = $name;
break;
}
}

function endElement($parser, $name) {
global $rss_channel, $currently_writing, $item_counter;
$currently_writing = "";
if ($name == "ITEM") {
$item_counter++;
}
}

function characterData($parser, $data) {
global $rss_channel, $currently_writing, $main, $item_counter;
if ($currently_writing != "") {
switch($main) {
case "CHANNEL":
if (isset($rss_channel[$currently_writing])) {
$rss_channel[$currently_writing] .= $data;
} else {
$rss_channel[$currently_writing] = $data;
}
break;
case "IMAGE":
if (isset($rss_channel[$main][$currently_writing])) {
$rss_channel[$main][$currently_writing] .= $data;
} else {
$rss_channel[$main][$currently_writing] = $data;
}
break;
case "ITEMS":
if (isset($rss_channel[$main][$item_counter][$currently_writing])) {
$rss_channel[$main][$item_counter][$currently_writing] .= $data;
} else {
$rss_channel[$main][$item_counter][$currently_writing] = $data;
}
break;
}
}
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);

// output HTML
// print ("<div class=\"channelname\">" . $rss_channel["TITLE"] . "</div>");

if (isset($rss_channel["ITEMS"])) {
if (count($rss_channel["ITEMS"]) > 0) {
for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) {
if (isset($rss_channel["ITEMS"][$i]["LINK"])) {
print ("\n<div><a href=\"" . $rss_channel["ITEMS"][$i]["LINK"] . "\">" . $rss_channel["ITEMS"][$i]["TITLE"] . "</a></div>");
}
else {
print ("\n<div>" . $rss_channel["ITEMS"][$i]["TITLE"] . "</div>");
}
//print ("<div class=\"itemdescription\">" . $rss_channel["ITEMS"][$i]["DESCRIPTION"] . "</div><br />");
}
}
else {
print ("<b>There are no articles in this feed.</b>");
}
}
//print ("<span style='font-size:xx-small;'><a href=\"http://www.globalsyndication.com/rss-parser\" style=\"color:white;\">Free PHP RSS Parser</a> - <a href=\"http://www.globalsyndication.com/rss-hosting\" style=\"color:white\">RSS Newsfeed Hosting</a></span>");
?>

i tried to make it as a function, and call these three functions in it, but it didnt work, so any HELP :o

NogDog
02-15-2006, 04:37 PM
The error message tells you that you are trying to define the function startelement() after having already defined it elsewhere (possibly in an include file?). If you need both functions, then one of them will have to have a different name. Or you may be including the same function definition file twice, in which case you should use include_once instead of include.

Cipher
02-15-2006, 05:50 PM
Well i tried to use include_once(), but its the same problem, and i tried to use other functions name and it worked :) , thank you.

SpectreReturns
02-15-2006, 07:36 PM
Encase each with something liek this if (!function_exists("startElement")) {
...
}