note 62425 added to ref.xml

From: Date: Tue, 28 Feb 2006 11:19:55 +0000
Subject: note 62425 added to ref.xml
Groups: php.notes 
Request: Send a blank email to php-notes+get-104555@lists.php.net to get a copy of this message
Here I introduce you an XML Parser which creats an array and can evaluate PHP code. If the PHP code returns a string the value of that string is added to the array. Here is the XML <?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY testEnt "test entity"> ]> <document> <foo> <?php $a = 'foo'; $b = 4; $c = $a.$b; echo "<b>It even evaluates html code $c</b>\n"; ?> </foo> <foo>hi this is text </foo> <foo> <?php echo $a; ?> </foo> </document> Note that <?php echo $a; ?> will not echo "foo" You might need to use include('foo.php'). And this is the Parser <?php $file = "xmltest2.xml"; $stack = array(); // start_element_handler ( resource parser, string name, array attribs ) function startElement($parser, $name, $attribs) { global $stack; $tag=array("name"=>$name,"attrs"=>$attrs); array_push($stack,$tag); } // end_element_handler ( resource parser, string name ) function endElement($parser, $name) { global $stack; $stack[count($stack)-2]['children'][] = $stack[count($stack)-1]; array_pop($stack); } // handler ( resource parser, string data ) function characterData($parser, $data) { global $stack,$i; if(trim($data)) { $stack[count($stack)-1]['data'] .= $data; } } // handler ( resource parser, string target, string data ) function PIHandler($parser, $target, $data) { global $stack,$i; //PHP EVALUATION if ((strtolower($target)) == "php") { global $parser_file; //eval($data); gust doesn't work if you want the //string added to the array $text .= '<?php '.$data.' ?>'; ob_start(); eval ('?>' . $text); $text = ob_get_clean(); $stack[count($stack)-1]['data'] .= $text; } } function defaultHandler($parser, $data) { } function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Could not open entity %s at %s\n", $openEntityNames, $systemId); return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("XML error: %s at line %d while parsing entity %s\n", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); xml_parser_free($parser); return false; } } xml_parser_free($parser); return true; } return false; } function new_xml_parser($file) { global $parser_file; $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0); xml_set_processing_instruction_handler($xml_parser, "PIHandler"); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); xml_set_default_handler($xml_parser, "defaultHandler"); xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); if (!($fp = @fopen($file, "r"))) { return false; } if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $file; return array($xml_parser, $fp); } if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input"); } //ERROR while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } //END xml_parser_free($xml_parser); print("<pre>\n"); print_r($stack); print("</pre>\n"); ?> ---- Server IP: 217.75.128.29 Probable Submitter: 213.240.224.31 ---- X-Spam-Status: No, hits=3.1 required=5.0 tests=DATE_MISSING,FROM_NO_LOWER autolearn=no version=2.64 ---- Manual Page -- http://www.php.net/manual/en/ref.xml.php Edit -- http://master.php.net/note/edit/62425 Del: integrated -- http://master.php.net/note/delete/62425/integrated Del: useless -- http://master.php.net/note/delete/62425/useless Del: bad code -- http://master.php.net/note/delete/62425/bad+code Del: spam -- http://master.php.net/note/delete/62425/spam Del: non-english -- http://master.php.net/note/delete/62425/non-english Del: in docs -- http://master.php.net/note/delete/62425/in+docs Del: other reasons-- http://master.php.net/note/delete/62425 Reject -- http://master.php.net/note/reject/62425 Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#104555) next »