---
name: "XML::Feed"
section: "3pm"
platform: "linux"
package: "libxml-feed-perl"
version: "0.65+dfsg-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/XML::Feed"
---

# XML::Feed(3pm)

Syndication feed parser and auto-discovery

## NAME

XML::Feed - Syndication feed parser and auto-discovery

## SYNOPSIS

```
    use XML::Feed;
    my $feed = XML::Feed->parse(URI->new('http://example.com/atom.xml'))
        or die XML::Feed->errstr;
    print $feed->title, "\n";
    for my $entry ($feed->entries) {
    }
    ## Find all of the syndication feeds on a given page, using
    ## auto-discovery.
    my @feeds = XML::Feed->find_feeds('http://example.com/');
```

## DESCRIPTION

*XML::Feed* is a syndication feed parser for both RSS and Atom feeds. It also implements feed auto-discovery for finding feeds, given a URI.

*XML::Feed* supports the following syndication feed formats:

- •

  RSS 0.91

- •

  RSS 1.0

- •

  RSS 2.0

- •

  Atom

The goal of *XML::Feed* is to provide a unified API for parsing and using the various syndication formats. The different flavors of RSS and Atom handle data in different ways: date handling; summaries and content; escaping and quoting; etc. This module attempts to remove those differences by providing a wrapper around the formats and the classes implementing those formats (XML::RSS and XML::Atom::Feed). For example, dates are handled differently in each of the above formats. To provide a unified API for date handling, *XML::Feed* converts all date formats transparently into DateTime objects, which it then returns to the caller.

## USAGE

### XML::Feed-\>new($format)

Creates a new empty *XML::Feed* object using the format *$format*.

```
    $feed = XML::Feed->new('Atom');
    $feed = XML::Feed->new('RSS');
    $feed = XML::Feed->new('RSS', version => '0.91');
```

### XML::Feed-\>parse($stream)

### XML::Feed-\>parse($stream, $format)

Parses a syndication feed identified by *$stream* and returns an *XML::Feed* object. *$stream* can be any one of the following:

- •

  Scalar reference

  A reference to string containing the XML body of the feed.

- •

  Filehandle

  An open filehandle from which the feed XML will be read.

- •

  File name

  The name of a file containing the feed XML.

- •

  URI object

  A URI from which the feed XML will be retrieved.

*$format* allows you to override format guessing.

### XML::Feed-\>get\_file($filename)

Gets a feed from a file.

*CML::Feed-\>get\_fh($fh)*

Gets a feed from pre-opened filehandle.

### XML::Feed-\>get\_uri($uri)

Gets a feed from a URI.

### XML::Feed-\>find\_feeds($uri)

Given a URI *$uri*, use auto-discovery to find all of the feeds linked from that page (using *\<link\>* tags).

Returns a list of feed URIs.

### XML::Feed-\>identify\_format(\\$xml)

Given the xml of a feed return what format it is in, with `"Atom"` or `"RSS"` for all versions of RSS.  Note that you pass in a scalar ref to the xml string.

### $feed-\>convert($format)

Converts the *XML::Feed* object into the *$format* format, and returns the new object.

### $feed-\>splice($other\_feed)

Splices in all of the entries from the feed *$other\_feed* into *$feed*, skipping posts that are already in *$feed*.

### $feed-\>format

Returns the format of the feed (`"Atom"`, or some version of `"RSS"`).

### $feed-\>title(\[ $title \])

The title of the feed/channel.

### $feed-\>base(\[ $base \])

The url base of the feed/channel.

### $feed-\>link(\[ $uri \])

The permalink of the feed/channel.

### $feed-\>tagline(\[ $tagline \])

The description or tagline of the feed/channel.

### $feed-\>description(\[ $description \])

Alias for *$feed-\>tagline*.

### $feed-\>author(\[ $author \])

The author of the feed/channel.

### $feed-\>language(\[ $language \])

The language of the feed.

### $feed-\>copyright(\[ $copyright \])

The copyright notice of the feed.

### $feed-\>modified(\[ $modified \])

A *DateTime* object representing the last-modified date of the feed.

If present, *$modified* should be a *DateTime* object.

### $feed-\>generator(\[ $generator \])

The generator of the feed.

### $feed-\>self\_link (\[ $uri \])

The Atom Self-link of the feed:

\<http://validator.w3.org/feed/docs/warning/MissingAtomSelfLink.html\>

A string.

### $feed-\>entries

A list of the entries/items in the feed. Returns an array containing XML::Feed::Entry objects.

### $feed-\>items

A synonym (alias) for `"$feed->entries"`.

### $feed-\>add\_entry($entry)

Adds an entry to the feed. *$entry* should be an XML::Feed::Entry object in the correct format for the feed.

### $feed-\>as\_xml

Returns an XML representation of the feed, in the format determined by the current format of the *$feed* object.

### $feed-\>first\_link (\[ $uri \])

The Atom First-link for feed paging and archiving (RFC 5005).

\<http://tools.ietf.org/html/rfc5005\>

### $feed-\>last\_link (\[ $uri \])

The Atom Last-link for feed paging and archiving.

### $feed-\>next\_link (\[ $uri \])

The Atom Next-link for feed paging and archiving.

### $feed-\>previous\_link (\[ $uri \])

The Atom Previous-link for feed paging and archiving.

### $feed-\>current\_link (\[ $uri \])

The Atom Current-link for feed paging and archiving.

### $feed-\>next\_archive\_link (\[ $uri \])

The Atom Next-link for feed paging and archiving.

### $feed-\>prev\_archive\_link (\[ $uri \])

The Atom Prev-Archive-link for feed paging and archiving.

## PACKAGE VARIABLES

- $XML::Feed::Format::RSS::PREFERRED\_PARSER

  If you want to use another RSS parser class than XML::RSS (default), you can change the class by setting `$PREFERRED_PARSER` variable in the XML::Feed::Format::RSS package.

  ```
      $XML::Feed::Format::RSS::PREFERRED_PARSER = "XML::RSS::LibXML";
  ```

  **Note:** this will only work for parsing feeds, not creating feeds.

  **Note:** Only `"XML::RSS::LibXML"` version 0.3004 is known to work at the moment.

- $XML::Feed::MULTIPLE\_ENCLOSURES

  Although the RSS specification states that there can be at most one enclosure per item some feeds break this rule.

  If this variable is set then `"XML::Feed"` captures all of them and makes them available as a list.

  Otherwise it returns the last enclosure parsed.

  **Note:** `"XML::RSS"` version 1.44 is needed for this to work.

## VALID FEEDS

For reference, this cgi script will create valid, albeit nonsensical feeds (according to `"http://feedvalidator.org"` anyway) for Atom 1.0 and RSS 0.90, 0.91, 1.0 and 2.0.

```
    #!perl -w
    use strict;
    use CGI;
    use CGI::Carp qw(fatalsToBrowser);
    use DateTime;
    use XML::Feed;
    my $cgi  = CGI->new;
    my @args = ( $cgi->param('format') // "Atom" );
    push @args, ( version => $cgi->param('version') ) if $cgi->param('version');
    my $feed = XML::Feed->new(@args);
    $feed->id("http://".time.rand()."/");
    $feed->title('Test Feed');
    $feed->link($cgi->url);
    $feed->self_link($cgi->url( -query => 1, -full => 1, -rewrite => 1) );
    $feed->modified(DateTime->now);
    my $entry = XML::Feed::Entry->new();
    $entry->id("http://".time.rand()."/");
    $entry->link("http://example.com");
    $entry->title("Test entry");
    $entry->summary("Test summary");
    $entry->content("Foo");
    $entry->modified(DateTime->now);
    $entry->author('test@example.com (Testy McTesterson)');
    $feed->add_entry($entry);
    my $mime = ("Atom" eq $feed->format) ? "application/atom+xml" : "application/rss+xml";
    print $cgi->header($mime);
    print $feed->as_xml;
```

## LICENSE

*XML::Feed* is free software; you may redistribute it and/or modify it under the same terms as Perl itself.

## AUTHOR & COPYRIGHT

Except where otherwise noted, *XML::Feed* is Copyright 2004-2008 Six Apart. All rights reserved.

## SUPPORT

For support contact the XML::Feed mailing list - xml-feed@perlhacks.com.

## SOURCE CODE

The latest version of *XML::Feed* can be found at

```
    http://github.com/davorg/XML-Feed
```
