[PHP] Re: Parsing PHP variables in XML document
So I have found this code in http://bg.php.net/manual/en/ref.xmlrpc.php and it evaluates PHP but when I try to use the PIHandler separately. It doesnt work. So I ask if someone could help me to make parser1 return an array just like parser2. PARSER1 ?php $file = xmltest2.xml; function trustedFile($file) { // only trust local files owned by ourselves if (!eregi(^([a-z]+)://, $file) fileowner($file) == getmyuid()) { return true; } return false; } function startElement($parser, $name, $attribs) { echo lt;font color=\#cc\$name/font; if (count($attribs)) { foreach ($attribs as $k = $v) { echo font color=\#009900\$k/font=\font color=\#99\$v/font\; } } echo gt;; } function endElement($parser, $name) { echo lt;/font color=\#cc\$name/fontgt;; } function characterData($parser, $data) { echo b$data/b; } function PIHandler($parser, $target, $data) { switch (strtolower($target)) { case php: global $parser_file; // If the parsed document is trusted, we say it is safe // to execute PHP code inside it. If not, display the code // instead. if (trustedFile($parser_file[$parser])) { eval($data); } else { printf(Untrusted PHP code: i%s/i, htmlspecialchars($data)); } break; } } function defaultHandler($parser, $data) { if (substr($data, 0, 1) == substr($data, -1, 1) == ;) { printf('font color=#aa00aa%s/font', htmlspecialchars($data)); } else { printf('font size=-1%s/font', htmlspecialchars($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, 1); xml_set_element_handler($xml_parser, startElement, endElement); xml_set_character_data_handler($xml_parser, characterData); xml_set_processing_instruction_handler($xml_parser, PIHandler); 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); } echo pre; 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))); } } echo /pre; echo parse complete\n; xml_parser_free($xml_parser); ? PARSER2 ?php $file = 'data.xml'; $stack = array(); function startTag($parser, $name, $attrs) { global $stack; $tag=array(name=$name,attrs=$attrs); array_push($stack,$tag); } function cdata($parser, $cdata) { global $stack,$i; if(trim($cdata)) { $stack[count($stack)-1]['cdata']=$cdata; } } function endTag($parser, $name) { global $stack; $stack[count($stack)-2]['children'][] = $stack[count($stack)-1]; array_pop($stack); } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, startTag, endTag); xml_set_character_data_handler($xml_parser, cdata); $data = xml_parse($xml_parser,file_get_contents($file)); if(!$data) { die(sprintf(XML error: %s at line %d, xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } xml_parser_free($xml_parser); print(pre\n); print_r($stack); print(/pre\n); ? Here is the xml file I used to test: ?xml version=1.0? !DOCTYPE foo [ !ENTITY testEnt test entity ] foo element attrib=value/ testEnt; ?php echo This is some more PHP code being executed.; ? /foo -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP] Re: Parsing PHP variables in XML document
I comed up with this ?php $file = xmltest2.xml; $stack = array(); $foo3 = wddw; // 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; eval(\$data = \$data\;); if(trim($data)) { $stack[count($stack)-1]['data']=$data; } } // handler ( resource parser, string target, string data ) function PIHandler($parser, $target, $data) { if ((strtolower($target)) == php) { global $parser_file; eval($data); } } 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); ? it evaluates php code. But when I use eval(\$data = \$data\;); the strings in the $data e.g. ('sth $foo other $foo1')do not appear. I think the problem is that it thinks they are undefined. Here is the xml file ?xml version=1.0? !DOCTYPE foo [ !ENTITY testEnt test entity ] document foo ?php $foo3='555'; echo Some text; ? /foo foo hi /foo foofoo $foo3 foo /foo /document -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP] Parsing PHP variables in XML document
Hi, I have the following problem. I want to import data into my site via PHP XML Parser, but I also want to include php string variables into the .xml file and when the xml file is parsed the variables are replaced whit the corresponding string. So far all my attempts have been unsuccessful. Here is the parser i have used ?php class XMLParser { var $filename; var $xml; var $data; function XMLParser($xml_file) { $this-filename = $xml_file; $this-xml = xml_parser_create(); xml_set_object($this-xml, $this); xml_set_element_handler($this-xml, 'startHandler', 'endHandler'); xml_set_character_data_handler($this-xml, 'dataHandler'); $this-parse($xml_file); } function parse($xml_file) { if (!($fp = fopen($xml_file, 'r'))) { die('Cannot open XML data file: '.$xml_file); return false; } $bytes_to_parse = 512; while ($data = fread($fp, $bytes_to_parse)) { $parse = xml_parse($this-xml, $data, feof($fp)); if (!$parse) { die(sprintf(XML error: %s at line %d, xml_error_string(xml_get_error_code($this-xml)), xml_get_current_line_number($this-xml))); xml_parser_free($this-xml ); } } return true; } function startHandler($parser, $name, $attributes) { $data['name'] = $name; if ($attributes) { $data['attributes'] = $attributes; } $this-data[] = $data; } function dataHandler($parser, $data) { if ($data = trim($data)) { $index = count($this-data) - 1; // begin multi-line bug fix (use the .= operator) $this-data[$index]['content'] .= $data; // end multi-line bug fix } } function endHandler($parser, $name) { if (count($this-data) 1) { $data = array_pop($this-data); $index = count($this-data) - 1; $this-data[$index]['child'][] = $data; } } } $url = 'data.xml'; $myFile = new XMLParser($url); echo PRE; print_r($myFile-data); echo /PRE; $foo3 = foo3; ? here is a sample XML file ?xml version='1.0'? !DOCTYPE chapter SYSTEM /just/a/test.dtd [ !ENTITY plainEntity FOO entity !ENTITY systemEntity SYSTEM xmltest2.xml ] document data foo1 /data data foo2 /data data ?php echo $foo3; ? /data data foo4 /data data foo5 /data /document and what I get is: Array ( [0] = Array ( [name] = DOCUMENT [child] = Array ( [0] = Array ( [name] = DATA [content] = foo1 ) [1] = Array ( [name] = DATA [content] = foo2 ) [2] = Array ( [name] = DATA ) [3] = Array ( [name] = DATA [content] = foo4 ) [4] = Array ( [name] = DATA [content] = foo5 ) ) ) ) So I want $myFile-data[0][child][2][content] to be equal to $foo3 -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
[PHP] Re: Parsing PHP variables in XML document
Well isn't there a way instead of using only variables, to use sth like ?php echo $foo; ? I tried it but it doesnt work The parser returns blank! On Sun, 2006-02-26 at 12:02 +0100, Bogdan Ribic wrote: Hmmm, come to think of it, it would only work if short_open_tags ini directive is turned OFF, which in most cases it won't be :( Bogdan Ribic wrote: Hi Ivan, You might be able to use output buffering in conjunction with including your xml file. Something like: ob_start(); include $xml_file; $content = ob_end_flush(); and then parse the $content string. If you are doing this from within a function and you want access to global variables, you should import all global variables first, via extract($GLOBALS); Btw, this is just an idea, and untested - use at your own risk :) Boban. -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php