On Tuesday 17 August 2004 21:38, Jan Hidders wrote:
Magnus Manske wrote:
As we are now progressing towards XML generation,
what to do with it?
I altered a little code from the PHP page about the XML parser to
arrange the XML in a treelike structure. Don't know where to put it,
so I'll just dump it below ;-)
Using the eval function makes it a bit hard to understand and I suspect
it isn't very efficient. How about the following: [...]
Here is a better version that doesn't require an array that stores all
elements in the tree:
<?
// the base class for an element
class element {
var $name = "";
var $attrs = array();
var $children = array();
function myPrint() {
echo "<UL>";
echo "<LI> <B> Name: </B> $this->name";
// print attributes
echo "<LI> <B> Attributes: </B>";
foreach ($this->attrs as $name => $value) {
echo "$name => $value; " ;
}
// print children
foreach ($this->children as $child) {
if ( is_string($child) ) {
echo "<LI> $child";
} else {
$child->myPrint();
}
}
echo "</UL>";
}
}
$ancStack = array(); // the stack with ancestral elements
// Three global functions needed for parsing, sorry guys
function wgXMLstartElement($parser, $name, $attrs) {
global $ancStack, $rootElem;
$newElem = new element;
$newElem->name = $name;
$newElem->attrs = $attrs;
array_push($ancStack, $newElem);
// add to parent if parent exists
$nrAncs = count($ancStack)-1;
if ( $nrAncs > 0 ) {
array_push($ancStack[$nrAncs-1]->children, &$ancStack[$nrAncs]);
} else {
// make extra copy of root element and alias it with the original
array_push($ancStack, &$ancStack[0]);
}
}
function wgXMLendElement($parser, $name) {
global $ancStack, $rootElem;
// pop element of stack
array_pop($ancStack);
}
function wgXMLcharacterData($parser, $data) {
global $ancStack, $rootElem;
// add to parent if parent exists
if ( $ancStack ) {
array_push($ancStack[count($ancStack)-1]->children, $data);
}
}
# Here's the class that generates a nice tree
class xml2php {
function &scanFile( $filename ) {
global $ancStack;
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "wgXMLstartElement",
"wgXMLendElement");
xml_set_character_data_handler($xml_parser,
"wgXMLcharacterData");
if (!($fp = fopen($filename, "r"))) {
die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
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);
// return the remaining root element we copied in the beginning
return $ancStack[0];
}
}
$w = new xml2php;
$filename = 'sample.xml';
$result = $w->scanFile( $filename );
$result->myPrint();
return 0;
?>