note 106743 added to ref.xml

From: Date: Fri, 02 Dec 2011 23:37:18 +0000
Subject: note 106743 added to ref.xml
Groups: php.notes 
Request: Send a blank email to php-notes+get-184876@lists.php.net to get a copy of this message
<?php /** * XML to Associative Array Class * * Usage: * $domObj = new xmlToArrayParser($xml); * $domArr = $domObj->array; * * if($domObj->parse_error) echo $domObj->get_xml_error(); * else print_r($domArr); * * On Success: * eg. $domArr['top']['element2']['attrib']['var2'] => val2 * * On Error: * eg. Error Code [76] "Mismatched tag", at char 58 on line 3 */ /** * Convert an xml file or string to an associative array (including the tag attributes): * $domObj = new xmlToArrayParser($xml); * $elemVal = $domObj->array['element'] * Or: $domArr=$domObj->array; $elemVal = $domArr['element']. * * @version 2.0 * @param Str $xml file/string. */ class xmlToArrayParser { /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/ public $array = array(); public $parse_error = false; private $parser; private $pointer; /** Constructor: $domObj = new xmlToArrayParser($xml); */ public function __construct($xml) { $this->pointer =& $this->array; $this->parser = xml_parser_create("UTF-8"); xml_set_object($this->parser, $this); xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($this->parser, "tag_open", "tag_close"); xml_set_character_data_handler($this->parser, "cdata"); $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true; } /** Free the parser. */ public function __destruct() { xml_parser_free($this->parser);} /** Get the xml error if an an error in the xml file occured during parsing. */ public function get_xml_error() { if($this->parse_error) { $errCode = xml_get_error_code ($this->parser); $thisError = "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\", at char ".xml_get_current_column_number($this->parser) . " on line ".xml_get_current_line_number($this->parser).""; }else $thisError = $this->parse_error; return $thisError; } private function tag_open($parser, $tag, $attributes) { $this->convert_to_array($tag, 'attrib'); $idx=$this->convert_to_array($tag, 'cdata'); if(isset($idx)) { $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer); $this->pointer =& $this->pointer[$tag][$idx]; }else { $this->pointer[$tag] = Array('@parent' => &$this->pointer); $this->pointer =& $this->pointer[$tag]; } if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; } } /** Adds the current elements content to the current pointer[cdata] array. */ private function cdata($parser, $cdata) { $this->pointer['cdata'] = trim($cdata); } private function tag_close($parser, $tag) { $current = & $this->pointer; if(isset($this->pointer['@idx'])) {unset($current['@idx']);} $this->pointer = & $this->pointer['@parent']; unset($current['@parent']); if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];} else if(empty($current['cdata'])) {unset($current['cdata']);} } /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */ private function convert_to_array($tag, $item) { if(isset($this->pointer[$tag][$item])) { $content = $this->pointer[$tag]; $this->pointer[$tag] = array((0) => $content); $idx = 1; }else if (isset($this->pointer[$tag])) { $idx = count($this->pointer[$tag]); if(!isset($this->pointer[$tag][0])) { foreach ($this->pointer[$tag] as $key => $value) { unset($this->pointer[$tag][$key]); $this->pointer[$tag][0][$key] = $value; }}}else $idx = null; return $idx; } } ?> ---- Server IP: 66.207.199.35 Probable Submitter: 206.75.202.212 ---- Manual Page -- http://www.php.net/manual/en/ref.xml.php Edit -- https://master.php.net/note/edit/106743 Del: integrated -- https://master.php.net/note/delete/106743/integrated Del: useless -- https://master.php.net/note/delete/106743/useless Del: bad code -- https://master.php.net/note/delete/106743/bad+code Del: spam -- https://master.php.net/note/delete/106743/spam Del: non-english -- https://master.php.net/note/delete/106743/non-english Del: in docs -- https://master.php.net/note/delete/106743/in+docs Del: other reasons-- https://master.php.net/note/delete/106743 Reject -- https://master.php.net/note/reject/106743 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#184876) next »