in reply to Re: Any help available for a newbie to XML::LibXML?
in thread Any help available for a newbie to XML::LibXML?

Hi again

I've written a bit more code to test it out and it is very slow doing the findnodes when I'm already at a position in the tree.

I've written this test script:

my $parser = XML::LibXML->new(); my $doc = $parser->parse_file($filename); my @devinfo = $doc->findnodes('//Device/Dev_Info'); foreach my $devinfo (@devinfo) { my($dev) = $devinfo->findnodes('./dev_name'); print $dev->to_literal, "\n"; }

The first findnodes runs very quickly (< 1 sec) but the one in the loop is a lot slower. But I don't know why. Doesn't it just have to examine the nodes "under" the current devinfo tag?

Am I doing something wrong with the findnodes call here?

Thanks, ~ Michael

Replies are listed 'Best First'.
Re^3: Any help available for a newbie to XML::LibXML?
by Corion (Patriarch) on Mar 03, 2008 at 08:51 UTC

    The only thing that I see from looking at your code that might be responsible would be that

    my($dev) = $devinfo->findnodes('./dev_name');

    actually finds many nodes just to throw them all away except for the first. Maybe do it this way to check how many nodes you find:

    my @found_devices = $devinfo->findnodes('./dev_name'); warn "Found " . scalar(@found_devices); my $dev = $found_devices[0];

    But that's just a shot in the dark. Actually looking at your XML, it shouldn't find more than one device.

      Thanks Corion - interesting thought.

      but unfortunately it's only finding 1 at a time. The speed is about 2 per second which is quite atrocious.

      And I agree, it should only find 1 too. I'm guessing there's a fixed overhead for findnodes which would make sense for what I'm seeing

      Anyway, I've got a few more replies to try out :-)
      and maybe it is time to re-visit my old friend XSLT

      Thanks again for the reply - I'll post back any more findings