1020611700 300 1020615600 14 2 out bytes in and out bits 10206117003.4000000000e+005.4400000000e+01 10206120003.4000000000e+005.4400000000e+01 10206123003.4000000000e+005.4400000000e+01 10206126003.4113333333e+005.4581333333e+01 10206129003.4000000000e+005.4400000000e+01 10206132003.4000000000e+005.4400000000e+01 10206135003.4000000000e+005.4400000000e+01 10206138003.4000000000e+005.4400000000e+01 10206141003.4000000000e+005.4400000000e+01 10206144003.4000000000e+005.4400000000e+01 10206147003.7333333333e+005.9733333333e+01 10206150003.4000000000e+005.4400000000e+01 10206153003.4000000000e+005.4400000000e+01 1020615600NaNNaN #### #!/usr/bin/perl -w use strict; use warnings; use XML::SAX; use XML::SAX::ParserFactory; use Data::Dumper; $Data::Dumper::Sortkeys = 1; $Data::Dumper::Indent = 1; use LWP::UserAgent; my %data; $data{values} = (); my $factory = XML::SAX::ParserFactory->new; $XML::SAX::ParserPackage = "XML::LibXML::SAX::Better"; $factory->require_feature('http://xml.org/sax/features/namespaces'); # now we do the way we want, sending chunks: my $streamed_events; my $handler = EventRecorder->new(\$streamed_events); my $p = $factory->parser(Handler => $handler); my $epoch = time; my $url = 'http://localhost/rrd_compare.xml'; my $xml = httpgetxml($url); sub httpgetxml { my $url = shift; my $ua = LWP::UserAgent->new; my $request = HTTP::Request->new(GET => $url); my $stuff = $ua->request($request, \&parseXenXMLchunk); } sub parseXenXMLchunk{ my ($data, $res, $req) = @_; $p->parse_chunk($data); return 1; } print Dumper \%data; package EventRecorder; use strict; use base qw(XML::SAX::Base); sub new { my ($class, $outref) = @_; $$outref = ""; return bless { outref => $outref, }; } sub start_element { my ($self, $data) = @_; } sub characters { my $self = shift; my $text = shift; $self->{text} .= $text->{Data}; } sub end_element{ my $self = shift; my $data = shift; my $text = $self->get_text(); # To be cleaned up later $text =~ s/\n//g; $text =~ s/^\s+//; $text =~ s/\s+$//; $text =~ s/\s+/ /; my $local_name = $data->{LocalName}; if ($local_name eq "step"){ $data{$local_name} = $text; } elsif ($local_name eq "entry"){ push @{$data{datasource}}, $text; } elsif ($local_name eq "t"){ $data{lasttime} = $text; } elsif ($local_name eq "v"){ push @{$data{values}{$data{lasttime}}}, $text; } } sub get_text { my $self = shift; my $text = ''; if ( defined( $self->{text} ) ) { $text = $self->{text}; $self->{text} = ''; } return $text; } # XML::LibXML::SAX::Better an extended SAX handler by Djabberd project package XML::LibXML::SAX::Better; use strict; use vars qw($VERSION @ISA); $VERSION = '1.00'; use XML::LibXML; use XML::SAX::Base; use base qw(XML::SAX::Base); sub new { my ($class, @params) = @_; my $inst = $class->SUPER::new(@params); my $libxml = XML::LibXML->new; $libxml->set_handler( $inst ); $inst->{LibParser} = $libxml; # setup SAX. 1 means "with SAX" $libxml->_start_push(1); $libxml->init_push; return $inst; } sub parse_chunk { my ( $self, $chunk ) = @_; my $libxml = $self->{LibParser}; my $rv = $libxml->push($chunk); } sub finish_push { my $self = shift; return 1 unless $self->{LibParser}; my $parser = delete $self->{LibParser}; return eval { $parser->finish_push }; } 1;