1020611700
300
1020615600
14
2
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;