XML-Atom-Stream
view release on metacpan or search on metacpan
lib/XML/Atom/Stream.pm view on Meta::CPAN
}
elsif ($elem =~ /^\{(.*?)\}([\w\-]+)$/) {
my($xmlns, $tag) = ($1, $2);
my $attr = shift @$stuff;
$xml .= qq(<$tag);
my $has_xmlns;
# extract and replace xmlns declarations
for my $key (keys %$attr) {
if ($key =~ m!^\{http://www\.w3\.org/2000/xmlns/\}([\w\-]+)$!) {
my $uri = delete $attr->{$key};
$ns{$uri} = $1;
$attr->{"xmlns:$1"} = $uri;
}
}
for my $key (keys %$attr) {
my $attr_key;
if ($key =~ /^\{(.*?)\}(\w+)$/) {
my($xmlns, $prefix) = ($1, $2);
my $ns = $ns{$xmlns} || 'xml'; # xml:lang
$attr_key = "$ns:$prefix";
} else {
$attr_key = $key;
$has_xmlns = 1 if $key eq 'xmlns';
}
$xml .= qq( $attr_key=") . encode_xml($attr->{$key}) . qq(");
}
$xml .= qq( xmlns="$xmlns") if $xmlns ne 'http://www.w3.org/2005/Atom' && !$has_xmlns;
if (@$stuff) {
$xml .= ">";
$dumper->($stuff);
$xml .= "</$tag>";
} else {
$xml .= "/>";
}
}
$dumper->($ref) if @$ref;
};
$dumper->($element);
my $feed = eval { XML::Atom::Feed->new(Stream => \$xml) };
$dumper = 0; # to avoid memory leak
if ($@) {
warn "Feed parse error: $@" if $self->{debug};
return;
}
$self->{callback}->($feed);
}
}
my %Map = ('&' => '&', '"' => '"', '<' => '<', '>' => '>',
'\'' => ''');
my $RE = join '|', keys %Map;
sub encode_xml {
my($str, $no_cdata) = @_;
if (!$no_cdata && $str =~ m/
<[^>]+> ## HTML markup
| ## or
&(?:(?!(\#([0-9]+)|\#x([0-9a-fA-F]+))).*?);
## something that looks like an HTML entity.
/x) {
## If ]]> exists in the string, encode the > to >.
$str =~ s/]]>/]]>/g;
$str = '<![CDATA[' . $str . ']]>';
} else {
$str =~ s!($RE)!$Map{$1}!g;
}
$str;
}
# from http://code.sixapart.com/svn/djabberd/trunk/dev/xml-test.pl
package XML::LibXML::SAX::Better;
use strict;
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 };
}
# compat for test:
sub _parse_string {
my ( $self, $string ) = @_;
# $self->{ParserOptions}{LibParser} = XML::LibXML->new;
$self->{ParserOptions}{LibParser} = XML::LibXML->new() unless defined $self->{ParserOptions}{LibParser};
$self->{ParserOptions}{ParseFunc} = \&XML::LibXML::parse_string;
$self->{ParserOptions}{ParseFuncParam} = $string;
return $self->_parse;
}
( run in 0.722 second using v1.01-cache-2.11-cpan-39bf76dae61 )