package XML::RSS::Parser::Lite::Item;
use strict;
our $VERSION = '0.10';
sub new {
my $class = shift;
my $self = {
'title', '',
'url', '',
'description', '',
@_,
};
bless($self, $class);
return $self;
}
sub set {
my $self = shift;
my %defs = (@_);
foreach my $k (keys %defs) {
$self->{$k} = $defs{$k};
}
}
sub get {
my $self = shift;
my $want = shift;
return $self->{$want};
}
package XML::RSS::Parser::Lite;
use strict;
use XML::Parser::Lite;
our $VERSION = '0.10';
sub new {
my $class = shift;
my $parser = new XML::Parser::Lite;
my $self = {
parser => $parser,
place => '',
title => '',
url => '',
description => '',
items => [],
latest => new XML::RSS::Parser::Lite::Item,
};
$self->{parser}->setHandlers(
Final => sub { shift; $self->final(@_) },
Start => sub { shift; $self->start(@_) },
End => sub { shift; $self->end(@_) },
Char => sub { shift; $self->char(@_) },
);
bless($self, $class);
return $self;
}
sub parse {
my $self = shift;
my $xml = shift;
$self->{parser}->parse($xml);
}
sub final {
my $self = shift;
$self->{parser}->setHandlers(Final => undef, Start => undef, End => undef, Char => undef);
}
sub start {
my $self = shift;
my $tag = shift;
$self->{place} .= "/$tag";
$self->{latest} = $self->add if ($self->{place} eq '/rss/channel/item');
}
sub char {
my $self = shift;
my $text = shift;
$self->{latest}->set('title', $text) if ($self->{place} eq '/rss/channel/item/title');
$self->{latest}->set('url', $text) if ($self->{place} eq '/rss/channel/item/link');
$self->{latest}->set('description', $text) if ($self->{place} eq '/rss/channel/item/description');
$self->{title} = $text if ($self->{place} eq '/rss/channel/title');
$self->{url} = $text if ($self->{place} eq '/rss/channel/link');
$self->{description} = $text if ($self->{place} eq '/rss/channel/description');
}
sub end {
my $self = shift;
my $tag = shift;
my $place = $self->{place};
$place = substr($place, 0, length($place)-length($tag)-1); # regex here causes segmentation fault!
$self->{place} = $place;
}
sub add {
my ($self) = shift;
my $it = new XML::RSS::Parser::Lite::Item(@_);
push(@{$self->{items}}, $it);
return $it;
}
sub count {
my $self = shift;
return scalar @{$self->{items}};
}
sub get {
my $self = shift;
my $what = shift;
if ($what =~ /^\d*$/) {
return @{$self->{items}}[$what];
}
return $self->{$what};
}
__END__
=head1 NAME
XML::RSS::Parser::Lite - A simple pure perl RSS parser.
=head1 SYNOPSIS
use XML::RSS::Parser::Lite;
use LWP::Simple;
my $xml = get("http://url.to.rss");
my $rp = new XML::RSS::Parser::Lite;
$rp->parse($xml);
print $rp->get('title') . " " . $rp->get('url') . " " . $rp->get('description') . "\n";
for (my $i = 0; $i < $rp->count(); $i++) {
my $it = $rp->get($i);
print $it->get('title') . " " . $it->get('url') . " " . $it->get('description') . "\n";
}
=head1 DESCRIPTION
XML::RSS::Parser::Lite is a simple pure perl RSS parser. It uses XML::Parser::Lite for its parsing.
=head1 METHODS
=over 4
=item $rp = new XML::RSS::Parser::Lite;
Creates a new RSS parser.
=item $rp->parse($xml);
Parses the supplied xml.
=item $items = $rp->count();
Returns the number of items in the RSS file.
=item $value = $rp->get($what);
Integers sent to get returns and XML::RSS::Parser::Lite::Item while the strings title, url, and description returns these
values from the RSS channel information.
=item $value = $item->get($what);
On an XML::RSS::Parser::Lite::Item this can return the strings title, url, or description.
=back
=head1 AUTHOR
Copyright (c) 2003 Erik Bosrup. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
=head1 AUTHOR
Erik Bosrup, erik@bosrup.com
1;