trying to parse xml

trying to parse xml

am 19.12.2007 21:06:00 von grande news

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



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

";
print_r($tree);
echo "
";

?>

Re: trying to parse xml

am 19.12.2007 21:24:58 von geekprogrammer.ed

On Dec 19, 3:06 pm, "Bint" wrote:
> 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
>
> >
> $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 "

";
> print_r($tree);
> echo "
";
>
> ?>

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

Re: trying to parse xml

am 19.12.2007 21:30:59 von grande news

end is a php function, it points the current position of an array to its
end.

Re: trying to parse xml

am 20.12.2007 10:57:28 von Toby A Inkster

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/11/28/itunes-sharing/