xml parser

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
yaron
Forum Contributor
Posts: 157
Joined: Fri Aug 22, 2003 8:40 am

xml parser

Post by yaron »

Hi all,
I need to parse an xml file in order to get the data i need.
each tag that contains 3 attribs (name, value,status) I need to store those 3 + file name and path to that tag.
Here is the parser I'm using now.
I can get my data quite easily from the start element function .
As you can see I store the attribs in that function.
What I need to add to that are 2 things.
1. the whole path for that specific tag who has this 3 attribs.
2. the name of the file that was parsed.

for the second issue I've tried a global variable but with no success.
any ideas?
thanks

<?php
global $file;
$file = $file1;
echo $file;

///////////////////////////////////////////////
$db = mysql_connect("localhost", "root");
mysql_select_db("myDb",$db);
///////////////////////////////////////////////


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) {
print "<<font color=\"#0000cc\">$name</font>";
if (sizeof($attribs)) {
$attArr=array();
while (list($k, $v) = each($attribs)) {
print " <font color=\"#009900\">$k</font>=\"<font
color=\"cyan\">$v</font>\"";
$attArr["$k"]=$v;
}
if(isset($attArr["NAME"]) && isset($attArr["VALUE"]) && isset($attArr["status"]))
{
$name=$attArr["NAME"];
$value=$attArr["VALUE"];
$permission=$attArr["status"];
$sql = "INSERT INTO temp VALUES ('$file','$name','$value','$permission')";
$result = mysql_query($sql);
}

}
print ">";
}

function endElement($parser, $name) {
print "</<font color=\"#0000cc\">$name</font>>";
}

function characterData($parser, $data) {
print "<b><i>$data</b></i>";
}

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");
}


print "<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)));
}
}
print "</pre>";
print "parse complete\n";
xml_parser_free($xml_parser);
?>
Post Reply