Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
xml_converter.inc
1 <?php
17 require_once 'XML/Parser.php';
18 
54 class XML_Converter extends XML_Parser
55 {
56 
62  var $array_xml;
63 
64 
70  var $indent_xml = false;
71 
72 
78  var $compact_array = false;
79 
80 
87  var $tag_level = 0;
88 
89 
99  function getStringFromArray($xml=NULL, $no_header=false)
100  {
101  if (!isset($xml)) $xml = &$this->array_xml;
102 
103  $this->tag_level = 0;
104 
105  $ret = $this->_getStringFromArrayInternal($xml);
106 
107  if (!$no_header) {
108  $ret = '<?xml version="1.0" encoding="utf-8"?>'.$ret;
109  }
110 
111  return $ret;
112 
113  }//end getStringFromArray()
114 
115 
124  function getArrayFromFile($xml_file)
125  {
126  $ret = NULL;
127 
128  $xml = file_get_contents($xml_file);
129 
130  if ($xml !== false) {
131  $ret = $this->getArrayFromString($xml);
132  }
133 
134  return $ret;
135 
136  }//end getArrayFromFile()
137 
138 
147  function getArrayFromString($xml)
148  {
149  $this->_reset();
150 
151  $this->parseString($xml);
152 
153  return $this->array_xml[0];
154 
155  }//end getArrayFromString()
156 
157 
169  function getElementContent(&$parent, $element_name, $default_value=NULL)
170  {
171  $ret = $default_value;
172 
173  if (isset($parent[$element_name][0]['-content'])) {
174  $ret = $parent[$element_name][0]['-content'];
175  }
176 
177  return $ret;
178 
179  }//end getElementContent()
180 
181 
191  function _getStringFromArrayInternal($xml=NULL, $parent_tag=0)
192  {
193  $is_tag_open = false;
194  $attributes = '';
195  $rc = "\n".str_repeat("\t", $this->tag_level ? $this->tag_level - 1 : 0);
196  $optional_rc = '';
197  $ret = '';
198 
199  if (is_array($xml)) {
200  foreach ($xml as $xml_key => $xml_val) {
201 
202  $is_tag_open |= !is_integer($xml_key);
203 
204  if (is_array($xml_val)) {
205  // empty element (no attr or subelement), we force to print the tag name
206  if (count($xml_val)) {
207  $optional_rc = $rc;
208  $tag_name = $xml_key;
209 
210  if (is_integer($xml_key)) {
211  $tag_name = $parent_tag;
212  }
213  else {
214  $this->tag_level++;
215  }
216 
217  $ret .= $this->_getStringFromArrayInternal($xml_val, $tag_name);
218 
219  if (!is_integer($xml_key)) $this->tag_level--;
220  }
221  else {
222  $is_tag_open = true;
223  }
224  }
225  else {
226  if ($xml_key == '-content') {
227  //$ret .= htmlentities($xml_val);
228  $xml_val = str_replace('&', '&amp;', $xml_val);
229  $ret .= $xml_val;
230  }
231  else if ($xml_key{0} == '@') {
232  $xml_key = substr($xml_key, 1);
233  $attributes .= " $xml_key=\"$xml_val\"";
234  }
235  else {
236  $optional_rc = $rc;
237  $ret .= "<$xml_key>$xml_val</$xml_key>";
238  }
239  }
240  }
241  }
242 
243  if ($is_tag_open && $parent_tag) {
244  $ret = "$rc<$parent_tag$attributes>$ret$optional_rc</$parent_tag>";
245  }
246 
247  return $ret;
248 
249  }//end _getStringFromArrayInternal()
250 
251 
258  function close()
259  {
260  if (!empty($this->parser) && is_resource($this->parser)) {
261  xml_parser_free($this->parser);
262  }
263 
264  }//end close()
265 
266 
273  function _reset()
274  {
275  $this->close();
276 
277  $this->folding = false;
278  $this->XML_Parser(null, 'event');
279 
280  $this->array_xml = Array(Array());
281 
282  }//end _reset()
283 
284 
291  function startHandler($xp, $elem, &$attribs)
292  {
293  $new_tag = Array();
294 
295  foreach ($attribs as $attrib_name => $attrib_value) {
296  $new_tag['@'.$attrib_name] = $attrib_value;
297  }
298 
299  $this->array_xml[] = &$new_tag;
300 
301  }//end startHandler()
302 
303 
310  function endHandler($xp, $elem)
311  {
312  $element_index = count($this->array_xml) - 1;
313  $element = &$this->array_xml[$element_index];
314  if (isset($element['-content'])) {
315  $element['-content'] = trim($element['-content']);
316  if ($element['-content'] == '') {
317  unset($this->array_xml[$element_index]['-content']);
318  }
319  }
320 
321  $this->array_xml[$element_index - 1][$elem][] = $element;
322 
323  array_pop($this->array_xml);
324 
325  }//end endHandler()
326 
327 
335  function cdataHandler($xp, $data)
336  {
337  if (isset($data)) {
338  $element = &$this->array_xml[count($this->array_xml) - 1];
339  if (!isset($element['-content'])) {
340  $element['-content'] = '';
341  }
342  $element['-content'] .= $data;
343  }
344 
345  }//end cdataHandler()
346 
347 
348 }//end class
349 
350 
351 ?>