[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

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 "";
print_r($myFile->data);
echo "";

$foo3 = "foo3";
?>

here is a sample XML file




]>



foo1


foo2





foo4


foo5



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

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



[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

$name";
   if (count($attribs)) {
   foreach ($attribs as $k => $v) {
   echo " $k=\"$v\"";
   }
   }
   echo ">";
}

function endElement($parser, $name)
{
   echo "";
}

function characterData($parser, $data)
{
   echo "$data";
}

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: %s",
   htmlspecialchars($data));
   }
   break;
   }
}

function defaultHandler($parser, $data)
{
   if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
   printf('%s',
   htmlspecialchars($data));
   } else {
   printf('%s',
   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 "";
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 "";
echo "parse complete\n";
xml_parser_free($xml_parser);

?>

PARSER2


$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("\n");
print_r($stack);
print("\n");
?>



Here is the xml file I used to test:



]>

   
   &testEnt;
   


-- 
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

$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("\n");
print_r($stack);
print("\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



]>


   


hi 

foo $foo3 foo



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php