I got a feed, and use xml_parser_create() to manipulate it… Then How do I save it to the database?
I am ok with these tutorial. So what I need is to save the individual chunk of information to the database.
thanks guys
I got a feed, and use xml_parser_create() to manipulate it… Then How do I save it to the database?
I am ok with these tutorial. So what I need is to save the individual chunk of information to the database.
thanks guys
I got a hand from my friends offline and they have this RSS extractor thingy
they said I can share it to the world so here it is.
CLASS rss_parser {
// constructor. setup parser options and handlers.
FUNCTION rss_parser() {
$this->error = '';
$this->file = '';
$this->channel = ARRAY();
$this->data = '';
$this->stack = ARRAY();
$this->num_items = 0;
$this->xml_parser = XML_PARSER_CREATE();
XML_SET_ELEMENT_HANDLER($this->xml_parser, "rss_start_element", "rss_end_element");
XML_SET_CHARACTER_DATA_HANDLER($this->xml_parser, "rss_character_data");
}
FUNCTION character_data($parser, $data) {
IF (EMPTY($this->data)) $this->data = TRIM($data); // concatenate non-parsed data...
ELSE $this->data .= ' '.TRIM($data); // and get rid of white space.
}
FUNCTION start_element($parser, $name, $attrs) {
SWITCH($name) {
CASE 'RSS':
BREAK;
CASE 'CHANNEL':
BREAK;
CASE 'IMAGE':
ARRAY_PUSH($this->stack, $name);
BREAK;
CASE 'ITEM':
ARRAY_PUSH($this->stack, $name);
ARRAY_PUSH($this->stack, $this->num_items); // push item index.
$this->item[$this->num_items] = ARRAY();
$this->num_items++;
BREAK;
CASE 'TEXTINPUT':
ARRAY_PUSH($this->stack, $name);
BREAK;
DEFAULT:
ARRAY_PUSH($this->stack, $name);
BREAK;
}
}
FUNCTION end_element($parser, $name) {
SWITCH ($name) {
CASE 'RSS':
BREAK;
CASE 'CHANNEL':
BREAK;
CASE 'IMAGE':
ARRAY_POP($this->stack);
BREAK;
CASE 'ITEM':
ARRAY_POP($this->stack);
ARRAY_POP($this->stack);
BREAK;
CASE 'TEXTINPUT':
ARRAY_POP($this->stack);
BREAK;
DEFAULT: // child element.
$element = (IMPLODE("']['",$this->stack));
EVAL("\\$this->channel['$element']=\\$this->data;"); // this does all the hard work.
ARRAY_POP($this->stack);
$this->data = '';
BREAK;
}
}
FUNCTION parse() {
IF (!($fp = @FOPEN($this->file, "r"))) {
$this->error = "Could not open RSS source \\"$this->file\\".";
RETURN FALSE;
}
WHILE ($data = FREAD($fp, 4096)) {
IF (!XML_PARSE($this->xml_parser, $data, FEOF($fp))) {
$this->error = SPRINTF("XML error: %s at line %d.",
XML_ERROR_STRING(XML_GET_ERROR_CODE($this->xml_parser)),
XML_GET_CURRENT_LINE_NUMBER($this->xml_parser));
RETURN FALSE;
}
}
XML_PARSER_FREE($this->xml_parser);
RETURN TRUE;
}
}
This is made out of PHP4 it is working you can all feast with it.
Can you just help me convert this to a more readable approach… but its alien to me.
Actually the flow of the start_element is the one that bugs me… xml_parser I understand but in
some parts it just bleed my nose out.
Thanks guys!