00001 <?php
00002
00019
00020
00021
00022
00023 define('XML_PARSER_SOURCE_ENCODING', Config::getVar('i18n', 'client_charset'));
00024 define('XML_PARSER_TARGET_ENCODING', Config::getVar('i18n', 'client_charset'));
00025
00026 import('xml.XMLParserDOMHandler');
00027
00028 class XMLParser {
00029
00031 var $magicQuotes;
00032
00034 var $handler;
00035
00040 function XMLParser() {
00041
00042 $this->magicQuotes = get_magic_quotes_runtime();
00043 set_magic_quotes_runtime(0);
00044 }
00045
00052 function &parse($file) {
00053 $parser = &$this->createParser();
00054
00055 if (!isset($this->handler)) {
00056
00057 $handler =& new XMLParserDOMHandler();
00058 $this->setHandler($handler);
00059 }
00060
00061 xml_set_object($parser, $this->handler);
00062 xml_set_element_handler($parser, "startElement", "endElement");
00063 xml_set_character_data_handler($parser, "characterData");
00064
00065 import('file.FileWrapper');
00066 $wrapper = &FileWrapper::wrapper($file);
00067
00068 while (is_object($newWrapper = $wrapper->open())) if (is_object($newWrapper)) {
00069 unset($wrapper);
00070 $wrapper =& $newWrapper;
00071 unset ($newWrapper);
00072 }
00073
00074 if (!$wrapper) {
00075 $result = false;
00076 return $result;
00077 }
00078
00079 while ($data = $wrapper->read()) {
00080 if (!xml_parse($parser, $data, $wrapper->eof())) {
00081 echo xml_error_string(xml_get_error_code($parser));
00082 $this->destroyParser($parser);
00083 $result = false;
00084 $wrapper->close();
00085 return $result;
00086 }
00087 }
00088
00089 $wrapper->close();
00090 $this->destroyParser($parser);
00091
00092 $result = &$this->handler->getResult();
00093 return $result;
00094 }
00095
00100 function setHandler(&$handler) {
00101 $this->handler =& $handler;
00102 }
00103
00111 function &parseStruct($file, $tagsToMatch = array()) {
00112 $parser = &$this->createParser();
00113 import('file.FileWrapper');
00114 $wrapper = &FileWrapper::wrapper($file);
00115 $fileContents = $wrapper->contents();
00116 if (!$fileContents) {
00117 $result = false;
00118 return $result;
00119 }
00120 xml_parse_into_struct($parser, $fileContents, $values, $tags);
00121 $this->destroyParser($parser);
00122
00123
00124 foreach ($tags as $key => $indices) {
00125 if (!empty($tagsToMatch) && !in_array($key, $tagsToMatch)) {
00126 continue;
00127 }
00128
00129 $data[$key] = array();
00130
00131 foreach ($indices as $index) {
00132 if (!isset($values[$index]['type']) || ($values[$index]['type'] != 'open' && $values[$index]['type'] != 'complete')) {
00133 continue;
00134 }
00135
00136 $data[$key][] = array(
00137 'attributes' => isset($values[$index]['attributes']) ? $values[$index]['attributes'] : array(),
00138 'value' => isset($values[$index]['value']) ? trim($values[$index]['value']) : ''
00139 );
00140 }
00141 }
00142
00143 return $data;
00144 }
00145
00150 function &createParser() {
00151 $parser = xml_parser_create(XML_PARSER_SOURCE_ENCODING);
00152 xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, XML_PARSER_TARGET_ENCODING);
00153 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
00154 return $parser;
00155 }
00156
00161 function destroyParser(&$parser) {
00162 xml_parser_free($parser);
00163 unset($parser);
00164 }
00165
00169 function destroy() {
00170
00171 set_magic_quotes_runtime($this->magicQuotes);
00172 unset($this);
00173 }
00174
00175 }
00176
00181 class XMLParserHandler {
00182
00186 function startElement(&$parser, $tag, $attributes) {
00187 }
00188
00192 function endElement(&$parser, $tag) {
00193 }
00194
00198 function characterData(&$parser, $data) {
00199 }
00200
00206 function &getResult() {
00207
00208 $nullVar = null;
00209 return $nullVar;
00210 }
00211
00212 }
00213
00214 ?>