* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class XmlParser extends BaseParser implements Parseable { // Exception constants const EXCEPTION_XML_PARSER_ERROR = 0x1e0; const EXCEPTION_XML_NODE_UNKNOWN = 0x1e1; const EXCEPTION_XML_NODE_MISMATCH = 0x1e2; /** * Protected constructor * * @return void */ protected function __construct () { // Call parent constructor parent::__construct(__CLASS__); } /** * Creates an instance of the class Parser and prepares it for usage * * @param $templateInstance A CompileableTemplate instance * @return $parserInstance An instance of this parser */ public final static function createXmlParser (CompileableTemplate $templateInstance) { // Get a new instance $parserInstance = new XmlParser(); // Set the template instance $parserInstance->setTemplateInstance($templateInstance); // Return the prepared instance return $parserInstance; } /** * Parses the given XML content * * @param $content Valid XML content * @return void * @throws XmlParserException If an XML error was found */ public function parseXmlContent ($content) { // Convert all to UTF8 if (function_exists('recode')) { // Recode found, so use it $content = recode('html..utf8', $content); } else { // @TODO We need to find a fallback solution here $this->partialStub('Cannot find recode extension!'); } // END - if // Get an XML parser $xmlParser = xml_parser_create(); // Force case-folding to on xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, true); // Set UTF-8 xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); // Get instance (we need this :( ) $templateInstance = $this->getTemplateInstance(); // Set object xml_set_object($xmlParser, $templateInstance); // Set handler call-backs xml_set_element_handler($xmlParser, 'startElement', 'endElement'); xml_set_character_data_handler($xmlParser, 'characterHandler'); // Now parse the XML tree if (!xml_parse($xmlParser, $content)) { // Error found in XML! //* DEBUG: */ die('
'.htmlentities($content).'
'); throw new XmlParserException(array($this, $xmlParser), self::EXCEPTION_XML_PARSER_ERROR); } // END - if // Free the parser xml_parser_free($xmlParser); } } // [EOF] ?>