189 lines
3.5 KiB
Perl
189 lines
3.5 KiB
Perl
# $Id: Stream.pm,v 1.1 2003-07-27 16:07:49 matt Exp $
|
|
|
|
package XML::Parser::Style::Stream;
|
|
use strict;
|
|
|
|
# This style invented by Tim Bray <tbray@textuality.com>
|
|
|
|
sub Init {
|
|
no strict 'refs';
|
|
my $expat = shift;
|
|
$expat->{Text} = '';
|
|
my $sub = $expat->{Pkg} . "::StartDocument";
|
|
&$sub($expat)
|
|
if defined(&$sub);
|
|
}
|
|
|
|
sub Start {
|
|
no strict 'refs';
|
|
my $expat = shift;
|
|
my $type = shift;
|
|
|
|
doText($expat);
|
|
$_ = "<$type";
|
|
|
|
%_ = @_;
|
|
while (@_) {
|
|
$_ .= ' ' . shift() . '="' . shift() . '"';
|
|
}
|
|
$_ .= '>';
|
|
|
|
my $sub = $expat->{Pkg} . "::StartTag";
|
|
if ( defined(&$sub) ) {
|
|
&$sub( $expat, $type );
|
|
}
|
|
else {
|
|
print;
|
|
}
|
|
}
|
|
|
|
sub End {
|
|
no strict 'refs';
|
|
my $expat = shift;
|
|
my $type = shift;
|
|
|
|
# Set right context for Text handler
|
|
push( @{ $expat->{Context} }, $type );
|
|
doText($expat);
|
|
pop( @{ $expat->{Context} } );
|
|
|
|
$_ = "</$type>";
|
|
|
|
my $sub = $expat->{Pkg} . "::EndTag";
|
|
if ( defined(&$sub) ) {
|
|
&$sub( $expat, $type );
|
|
}
|
|
else {
|
|
print;
|
|
}
|
|
}
|
|
|
|
sub Char {
|
|
my $expat = shift;
|
|
$expat->{Text} .= shift;
|
|
}
|
|
|
|
sub Proc {
|
|
no strict 'refs';
|
|
my $expat = shift;
|
|
my $target = shift;
|
|
my $text = shift;
|
|
|
|
doText($expat);
|
|
|
|
$_ = "<?$target $text?>";
|
|
|
|
my $sub = $expat->{Pkg} . "::PI";
|
|
if ( defined(&$sub) ) {
|
|
&$sub( $expat, $target, $text );
|
|
}
|
|
else {
|
|
print;
|
|
}
|
|
}
|
|
|
|
sub Final {
|
|
no strict 'refs';
|
|
my $expat = shift;
|
|
my $sub = $expat->{Pkg} . "::EndDocument";
|
|
&$sub($expat)
|
|
if defined(&$sub);
|
|
}
|
|
|
|
sub doText {
|
|
no strict 'refs';
|
|
my $expat = shift;
|
|
$_ = $expat->{Text};
|
|
|
|
if ( length($_) ) {
|
|
my $sub = $expat->{Pkg} . "::Text";
|
|
if ( defined(&$sub) ) {
|
|
&$sub($expat);
|
|
}
|
|
else {
|
|
print;
|
|
}
|
|
|
|
$expat->{Text} = '';
|
|
}
|
|
}
|
|
|
|
1;
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
XML::Parser::Style::Stream - Stream style for XML::Parser
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use XML::Parser;
|
|
my $p = XML::Parser->new(Style => 'Stream', Pkg => 'MySubs');
|
|
$p->parsefile('foo.xml');
|
|
|
|
{
|
|
package MySubs;
|
|
|
|
sub StartTag {
|
|
my ($e, $name) = @_;
|
|
# do something with start tags
|
|
}
|
|
|
|
sub EndTag {
|
|
my ($e, $name) = @_;
|
|
# do something with end tags
|
|
}
|
|
|
|
sub Characters {
|
|
my ($e, $data) = @_;
|
|
# do something with text nodes
|
|
}
|
|
}
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This style uses the Pkg option to find subs in a given package to call for each event.
|
|
If none of the subs that this
|
|
style looks for is there, then the effect of parsing with this style is
|
|
to print a canonical copy of the document without comments or declarations.
|
|
All the subs receive as their 1st parameter the Expat instance for the
|
|
document they're parsing.
|
|
|
|
It looks for the following routines:
|
|
|
|
=over 4
|
|
|
|
=item * StartDocument
|
|
|
|
Called at the start of the parse .
|
|
|
|
=item * StartTag
|
|
|
|
Called for every start tag with a second parameter of the element type. The $_
|
|
variable will contain a copy of the tag and the %_ variable will contain
|
|
attribute values supplied for that element.
|
|
|
|
=item * EndTag
|
|
|
|
Called for every end tag with a second parameter of the element type. The $_
|
|
variable will contain a copy of the end tag.
|
|
|
|
=item * Text
|
|
|
|
Called just before start or end tags with accumulated non-markup text in
|
|
the $_ variable.
|
|
|
|
=item * PI
|
|
|
|
Called for processing instructions. The $_ variable will contain a copy of
|
|
the PI and the target and data are sent as 2nd and 3rd parameters
|
|
respectively.
|
|
|
|
=item * EndDocument
|
|
|
|
Called at conclusion of the parse.
|
|
|
|
=back
|
|
|
|
=cut
|