XpressEngine Core  1.11.2
 All Classes Namespaces Files Functions Variables Pages
XmlParser.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) NAVER <http://www.navercorp.com> */
3 
11 class Xml_Node_
12 {
13 
18  function __get($name)
19  {
20  return NULL;
21  }
22 
23 }
24 
38 class XmlParser
39 {
40 
45  var $oParser = NULL;
46 
51  var $input = NULL;
52 
57  var $output = array();
58 
63  var $lang = "en";
64 
70  function loadXmlFile($filename)
71  {
72  if(!file_exists($filename))
73  {
74  return;
75  }
76  $buff = FileHandler::readFile($filename);
77 
78  $oXmlParser = new XmlParser();
79  return $oXmlParser->parse($buff);
80  }
81 
89  function parse($input = '', $arg1 = NULL, $arg2 = NULL)
90  {
91  // Save the compile starting time for debugging
92  if(__DEBUG__ == 3)
93  {
94  $start = getMicroTime();
95  }
96 
97  $this->lang = Context::getLangType();
98 
99  $this->input = $input ? $input : $GLOBALS['HTTP_RAW_POST_DATA'];
100  $this->input = str_replace(array('', ''), array('', ''), $this->input);
101 
102  // extracts a supported language
103  preg_match_all("/xml:lang=\"([^\"].+)\"/i", $this->input, $matches);
104 
105  // extracts the supported lanuage when xml:lang is used
106  if(count($matches[1]) && $supported_lang = array_unique($matches[1]))
107  {
108  $tmpLangList = array_flip($supported_lang);
109  // if lang of the first log-in user doesn't exist, apply en by default if exists. Otherwise apply the first lang.
110  if(!isset($tmpLangList[$this->lang]))
111  {
112  if(isset($tmpLangList['en']))
113  {
114  $this->lang = 'en';
115  }
116  else
117  {
118  $this->lang = array_shift($supported_lang);
119  }
120  }
121  // uncheck the language if no specific language is set.
122  }
123  else
124  {
125  $this->lang = '';
126  }
127 
128  $this->oParser = xml_parser_create('UTF-8');
129 
130  xml_set_object($this->oParser, $this);
131  xml_set_element_handler($this->oParser, "_tagOpen", "_tagClosed");
132  xml_set_character_data_handler($this->oParser, "_tagBody");
133 
134  xml_parse($this->oParser, $this->input);
135  xml_parser_free($this->oParser);
136 
137  if(!count($this->output))
138  {
139  return;
140  }
141 
142  $output = array_shift($this->output);
143  // Save compile starting time for debugging
144  if(__DEBUG__ == 3)
145  {
146  $GLOBALS['__xmlparse_elapsed__'] += getMicroTime() - $start;
147  }
148 
149  return $output;
150  }
151 
159  function _tagOpen($parser, $node_name, $attrs)
160  {
161  $obj = new Xml_Node_();
162  $obj->node_name = strtolower($node_name);
163  $obj->attrs = $this->_arrToAttrsObj($attrs);
164 
165  $this->output[] = $obj;
166  }
167 
175  function _tagBody($parser, $body)
176  {
177  //if(!trim($body)) return;
178  $this->output[count($this->output) - 1]->body .= $body;
179  }
180 
187  function _tagClosed($parser, $node_name)
188  {
189  $node_name = strtolower($node_name);
190  $cur_obj = array_pop($this->output);
191  $parent_obj = &$this->output[count($this->output) - 1];
192  if($this->lang && $cur_obj->attrs->{'xml:lang'} && $cur_obj->attrs->{'xml:lang'} != $this->lang)
193  {
194  return;
195  }
196  if($this->lang && $parent_obj->{$node_name}->attrs->{'xml:lang'} && $parent_obj->{$node_name}->attrs->{'xml:lang'} != $this->lang)
197  {
198  return;
199  }
200 
201  if(isset($parent_obj->{$node_name}))
202  {
203  $tmp_obj = $parent_obj->{$node_name};
204  if(is_array($tmp_obj))
205  {
206  $parent_obj->{$node_name}[] = $cur_obj;
207  }
208  else
209  {
210  $parent_obj->{$node_name} = array($tmp_obj, $cur_obj);
211  }
212  }
213  else
214  {
215  if(!is_object($parent_obj))
216  {
217  $parent_obj = (object) $parent_obj;
218  }
219 
220  $parent_obj->{$node_name} = $cur_obj;
221  }
222  }
223 
229  function _arrToAttrsObj($arr)
230  {
231  $output = new Xml_Node_();
232  foreach($arr as $key => $val)
233  {
234  $key = strtolower($key);
235  $output->{$key} = $val;
236  }
237  return $output;
238  }
239 
240 }
241 /* End of file XmlParser.class.php */
242 /* Location: ./classes/xml/XmlParser.class.php */
$obj
Definition: ko.install.php:262
getMicroTime()
Definition: func.inc.php:986
if(file_exists(_XE_PATH_. 'config/config.user.inc.php')) if(!defined('__DEBUG__')) if(!defined('__DEBUG_OUTPUT__')) if(!defined('__DEBUG_PROTECT__')) if(!defined('__DEBUG_PROTECT_IP__')) if(!defined('__DEBUG_DB_OUTPUT__')) if(!defined('__LOG_SLOW_QUERY__')) if(!defined('__LOG_SLOW_TRIGGER__')) if(!defined('__LOG_SLOW_ADDON__')) if(!defined('__LOG_SLOW_WIDGET__')) if(!defined('__DEBUG_QUERY__')) if(!defined('__OB_GZHANDLER_ENABLE__')) if(!defined('__ENABLE_PHPUNIT_TEST__')) if(!defined('__PROXY_SERVER__')) if(!defined('__ERROR_LOG__')) if(!defined('__DISABLE_DEFAULT_CSS__')) if(!defined('__AUTO_OPCACHE_INVALIDATE__')) if((__DEBUG_OUTPUT__==2)&&version_compare(PHP_VERSION, '6.0.0')===-1) if(version_compare(PHP_VERSION, '5.3.0') >=0) $GLOBALS['__xe_autoload_file_map']
Definition: config.inc.php:324
$output
Definition: ko.install.php:193
parse($input= '', $arg1=NULL, $arg2=NULL)
_tagBody($parser, $body)
_arrToAttrsObj($arr)
readFile($filename)
loadXmlFile($filename)
_tagOpen($parser, $node_name, $attrs)
if(isset($_REQUEST['encode'])) if(isset($_REQUEST['decode'])) $lang
Definition: example.php:23
_tagClosed($parser, $node_name)