blob: 452e69afb0d6cbada7bcd43310783421f89e8559 [file] [log] [blame]
<?php
/**
* *****************************************************************************
* Copyright (c) 2006 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wayne Beaton (Eclipse Foundation)- initial API and implementation
* *****************************************************************************
*/
// *****************************************************************************
//
// ** THIS FUNCTIONALITY IN THIS FILE IS DEPRECATED.
// ** USE THE XML_SIMPLE APIS INSTEAD.
//
// news.php
//
// Author: Wayne Beaton
// Date: 2005-11-07
//
// Description: This file contains code to assist with using a SAX parser
// on an XML file. Beware: it's weird.
//
// ****************************************************************************
/*
* This function does the actual work of parsing the RSS
* file into an object representation. We use a SAX parser
* to do this.
* Note that this function is intended to be used with relatively
* short files (the entire file contents are loaded into memory).
* If the RSS files start to get too large, this method will need
* to be updated.
* @deprecated
*/
function parse_xml_file($file_name, & $file_handler) {
$file_handler->initialize();
// Read the entire file contents in to memory.
// If file sizes get too large, we'll have to be smarter here.
$file = fopen($file_name, "r");
$xml = fread($file, filesize($file_name));
fclose($file);
parse_xml_string($xml, $file_handler);
}
function parse_xml_string($xml, & $file_handler) {
$GLOBALS['handler'] = $file_handler;
$parser = xml_parser_create();
xml_set_element_handler($parser, 'sax_start_handler', 'sax_end_handler');
xml_set_character_data_handler($parser, 'sax_data_handler');
xml_parse($parser, $xml);
if (xml_get_error_code($parser))
throw new SaxParsingException(xml_error_string($parser));
}
class SaxParsingException extends Exception {
public function __construct($message, $code = 0) {
parent::__construct($message, $code);
}
}
/*
* The $handler variable is global. It manages all the call backs
* that come (indirectly) from the SAX parser.
*/
$handler = null;
/*
* SAX parser callback method to handle the start of an element.
* This method just defers to the global handler to do the actual
* work.
*/
function sax_start_handler($parser, $name, $attributes) {
global $handler;
$handler->start($name, $attributes);
}
/*
* SAX parser callback method to handle the text for an element.
* This method just defers to the global handler to do the actual
* work.
*/
function sax_data_handler($parser, $data) {
global $handler;
$handler->data($data);
}
/*
* SAX parser callback method to handle the end of an element.
* This method just defers to the global handler to do the actual
* work.
*/
function sax_end_handler($parser, $name) {
global $handler;
$handler->end($name);
}
/*
* The XmlHandler class is the focal point of the SAX parser callbacks.
* It keeps track of a stack of element handlers. The element handlers
* are used to handle whatever elements come in.
*/
class XmlFileHandler {
var $stack;
function XmlFileHandler() {
$this->stack = array();
}
function initialize() {
$element_handler = $this->get_root_element_handler();
array_push($this->stack, $element_handler);
}
function get_root_element_handler() {
return new DoNothingHandler();
}
function end_root_element_handler($handler) {
}
/*
* Handle the start callback. Here, we get the current element handler
* from the top of the stack and ask it what to do. The element handler
* is asked to provide a new handler to handle the new element. That new
* handler is put on the top of the stack and will handle all future
* callbacks until it is removed (by the end method).
*/
function start($name, $attributes) {
$handler = & array_last($this->stack);
$next = & $handler->get_next($name, $attributes);
array_push($this->stack, $next);
}
/*
* Data has been encountered, send the data to the current element handler
* to sort out what needs to be done.
*/
function data($data) {
$handler = & array_last($this->stack);
$handler->data($data);
}
/*
* The end of an element has occurred. Pop the current element handler
* from the top of the stack and tell it that it's work is done.
*/
function end($name) {
$handler = & array_pop($this->stack);
$handler->end($name);
$next_handler = & array_last($this->stack);
$next_handler->end_handler($name, $handler);
// If we've just popped off the last actual element handler, leaving
// only the root handler at the top of the stack, send it the end message.
if (count($this->stack) == 1)
$this->end_root_element_handler($handler);
}
}
class XmlElementHandler {
function &get_next($name, $attributes) {
$method_name = "get_" . str_replace("-", "_", $name) . "_handler";
if (method_exists($this, $method_name)) {
return $this->$method_name($attributes);
}
else {
return new DoNothingHandler();
}
}
function end_handler($name, $handler) {
$method_name = "end_" . str_replace("-", "_", $name) . "_handler";
if (method_exists($this, $method_name)) {
return $this->$method_name($handler);
}
}
function initialize() {
}
/*
* Ignore data for this element.
*/
function data($data) {
}
function start($name) {
}
/*
* Ignore data for this element.
*/
function end($name) {
}
}
class SimpleTextHandler extends XmlElementHandler {
var $text;
function &get_next($name, $attributes) {
return new DoNothingHandler();
}
function data($data) {
$this->text .= $data;
}
function end($name) {
$this->text = html_entity_decode($this->text);
}
}
class SimplePropertyHandler extends SimpleTextHandler {
var $owner;
var $property;
function SimplePropertyHandler(& $owner, $property) {
$this->owner = & $owner;
$this->property = $property;
}
function end($name) {
parent::end($name);
$this->set_property_value($this->text);
}
function set_property_value(& $value) {
$property = $this->property;
$this->owner->$property = $value;
}
}
class DoNothingHandler extends XmlElementHandler {
function &get_next($name, $attributes) {
return $this;
}
}
function &array_last(& $array) {
return $array[count($array) - 1];
}