libxml-enno
view release on metacpan or search on metacpan
lib/XML/Filter/SAXT.pm view on Meta::CPAN
#
# To do:
# - later: ErrorHandler, Locale?
package XML::Filter::SAXT;
use strict;
use vars qw( %SAX_HANDLERS );
%SAX_HANDLERS = ( DocumentHandler =>
[ "start_document",
"end_document",
"start_element",
"end_element",
"characters",
"processing_instruction",
"comment",
"start_cdata",
"end_cdata",
"entity_reference",
"set_document_locator" # !! passes {Locator=>$perlsax}
],
DTDHandler =>
[ "notation_decl",
"unparsed_entity_decl",
"entity_decl",
"element_decl",
"attlist_decl",
"doctype_decl",
"xml_decl"
],
EntityResolver =>
[ "resolve_entity" ]);
#
# Usage:
#
# $saxt = new XML::Filter::SAXT ( { Handler => $out0 },
# { DocumentHandler => $out1 },
# { DTDHandler => $out3,
# Handler => $out4
# }
# );
#
# $perlsax = new XML::Parser::PerlSAX ( Handler => $saxt );
# $perlsax->parse ( [OPTIONS] );
#
sub new
{
my ($class, @out) = @_;
my $self = bless { Out => \@out }, $class;
for (my $i = 0; $i < @out; $i++)
{
for my $handler (keys %SAX_HANDLERS)
{
my $callbacks = $SAX_HANDLERS{$handler};
my $h = ($self->{Out}->[$i]->{$handler} ||= $self->{Out}->[$i]->{Handler});
next unless defined $h;
for my $cb (@$callbacks)
{
if (UNIVERSAL::can ($h, $cb))
{
$self->{$cb} .= "\$out->[$i]->{$handler}->$cb (\@_);\n";
}
}
}
}
for my $handler (keys %SAX_HANDLERS)
{
my $callbacks = $SAX_HANDLERS{$handler};
for my $cb (@$callbacks)
{
my $code = $self->{$cb};
( run in 1.058 second using v1.01-cache-2.11-cpan-7fcb06a456a )