Learning Perl
Programming
####
Learning Perl
Programming,Learning,Perl
####
use warnings;
use strict;
use XML::SAX::Machines qw(Pipeline);
my $m = Pipeline(
'XML::Filter::BufferText' =>
'XML::Filter::Category' =>
\*STDOUT
);
$m->parse_file( *DATA );
package XML::Filter::Category;
use base qw(XML::SAX::Base);
#
# $el->{Name} == 'marker'
# $el->{Attributes}{'{}language'} == language attribute
# $el->{Attributes}{'{}language'}{Value} == 'foo'
sub start_element {
my($self, $el) = @_;
if ( $el->{Name} eq 'title' ) {
$self->{record}{title}{start_element} = $el;
$self->{in_title} = 1;
} elsif ( $el->{Name} eq 'category' ) {
$self->{record}{category}{start_element} = $el;
$self->{in_category} = 1;
} else { # go ahead and forward upstream
$self->SUPER::start_element( $el );
}
}
sub characters {
my ($self, $chars) = @_;
if ( $self->{in_title} ) {
$self->{record}{title}{characters} = $chars;
} elsif ( $self->{in_category} ) {
$self->{record}{category}{characters} = $chars;
} else { # go ahead and forward upstream
$self->SUPER::characters( $chars );
}
}
sub end_element {
my($self, $el) = @_;
if ( $el->{Name} eq 'title' ) {
$self->{record}{title}{end_element} = $el;
$self->{in_title} = 0;
} elsif ( $el->{Name} eq 'category' ) {
$self->{record}{category}{end_element} = $el;
$self->{in_category} = 0;
} elsif ( $el->{Name} eq 'record' ) { # transform category
my $r = $self->{record};
my @extra_cats = split(' ', $r->{title}{characters}{Data});
$r->{category}{characters}{Data} .= ',' . join(',', @extra_cats);
while( my( $node, $data ) = each( %{$self->{record}} ) ) {
$self->SUPER::start_element( $data->{start_element} );
$self->SUPER::characters( $data->{characters} );
$self->SUPER::end_element( $data->{end_element} );
}
$self->SUPER::end_element( $el );
} else { # go ahead and forward upstream
$self->SUPER::end_element( $el );
}
}
package main;
__DATA__
Learning Perl
Programming
O'Reilly
http://www.oreilly.com/catalog/learnperl4/
O'Reilly
Programming
Learning Ruby
http://www.oreilly.com/catalog/9780596529864/index.html
Learning Python
O'Reilly
Programming
http://www.oreilly.com/catalog/lpython2/index.html
####
$ perl modify_category.pl
O'Reilly
http://www.oreilly.com/catalog/learnperl4/
Programming,Learning,Perl
Learning Perl
O'Reilly
http://www.oreilly.com/catalog/9780596529864/index.html
Programming,Learning,Ruby
Learning Ruby
O'Reilly
http://www.oreilly.com/catalog/lpython2/index.html
Programming,Learning,Python
Learning Python