[PHP] Re: Parsing PHP variables in XML document

2006-02-27 Thread Ivan Nedialkov


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

2006-02-27 Thread Ivan Nedialkov
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

2006-02-26 Thread Ivan Nedialkov
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

2006-02-26 Thread Ivan Nedialkov
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