By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,991 Members | 1,888 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,991 IT Pros & Developers. It's quick & easy.

trying to parse xml

P: n/a
Hi,

I'm trying to parse an xml file into an array tree. From the PHP site
in the comments, I got this code. But it doesn't work for me. It's saying
that the passed variable is not an array or object in the call end($stack),
in the first function startElement(). Anyone know why that would be?
$stack is an array, as far as I can tell.

Thanks
B
<?php

$file = "data.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[] = &$tree;
function startElement($parser, $name, $attrs) {
global $depth;
global $stack;
global $tree;

$element = array();
foreach ($attrs as $key =$value) {
$element[strtolower($key)]=$value;
}

end($stack);
$stack[key($stack)][strtolower($name)] = &$element;
$stack[strtolower($name)] = &$element;

$depth++;
}

function endElement($parser, $name) {
global $depth;
global $stack;

array_pop($stack);
$depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "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);
$tree = end(end($stack));
echo "<pre>";
print_r($tree);
echo "</pre>";

?>
Dec 19 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On Dec 19, 3:06 pm, "Bint" <b...@csgs.comwrote:
Hi,

I'm trying to parse an xml file into an array tree. From the PHP site
in the comments, I got this code. But it doesn't work for me. It's saying
that the passed variable is not an array or object in the call end($stack),
in the first function startElement(). Anyone know why that would be?
$stack is an array, as far as I can tell.

Thanks
B

<?php

$file = "data.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[] = &$tree;

function startElement($parser, $name, $attrs) {
global $depth;
global $stack;
global $tree;

$element = array();
foreach ($attrs as $key =$value) {
$element[strtolower($key)]=$value;
}

end($stack);
$stack[key($stack)][strtolower($name)] = &$element;
$stack[strtolower($name)] = &$element;

$depth++;

}

function endElement($parser, $name) {
global $depth;
global $stack;

array_pop($stack);
$depth--;

}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "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);
$tree = end(end($stack));
echo "<pre>";
print_r($tree);
echo "</pre>";

?>
maybe its just me, but where is this function "end" set up?

Dec 19 '07 #2

P: n/a
end is a php function, it points the current position of an array to its
end.
Dec 19 '07 #3

P: n/a
Bint wrote:
I'm trying to parse an xml file into an array tree. From the PHP site
in the comments, I got this code. But it doesn't work for me. It's
saying that the passed variable is not an array or object in the call
end($stack), in the first function startElement(). Anyone know why that
would be? $stack is an array, as far as I can tell.
Not the most elegant code, but it seems to work here using PHP 5.2.5.
Which version of PHP are you using?

--
Toby A Inkster BSc (Hons) ARCS
[Geek of HTML/SQL/Perl/PHP/Python/Apache/Linux]
[OS: Linux 2.6.17.14-mm-desktop-9mdvsmp, up 12 days, 20:32.]

Sharing Music with Apple iTunes
http://tobyinkster.co.uk/blog/2007/1...tunes-sharing/
Dec 20 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.