use warnings; use strict; use XML::LibXML; use HTTP::Tiny; use URI; my $parser = XML::LibXML->new; my $cb = XML::LibXML::InputCallback->new; my $http = HTTP::Tiny->new; my %cache; $cb->register_callbacks([ sub { 1 }, # match (URI), returns Bool sub { # open (URI), returns Handle my $uri = URI->new($_[0]); my $file; #warn "Handling <<$uri>>\n"; #Debug if (!$uri->scheme) { $file = $_[0] } elsif ($uri->scheme eq 'file') { $file = $uri->path } elsif ($uri->scheme=~/\Ahttps?\z/i) { if (!defined $cache{$uri}) { my $resp = $http->get($uri); die "$uri: $resp->{status} $resp->{reason}\n" unless $resp->{success}; $cache{$uri} = $resp->{content}; } $file = \$cache{$uri}; } else { die "unsupported URL scheme: ".$uri->scheme } open my $fh, '<', $file or die "$file: $!"; return $fh; }, sub { # read (Handle,Length), returns Data my ($fh,$len) = @_; read($fh, my $buf, $len); return $buf; }, sub { close shift } # close (Handle) ]); $parser->input_callbacks($cb); my $doc = $parser->load_xml( IO => \*DATA ); print "Is valid: ", $doc->is_valid ? "yes" : "no", "\n"; __DATA__ ]> 1 XXXX &icon.url; PubMed 1234567890 &base.url; /1/