My subscriptions list in OPML, XOXO and Atom

For a larf, I added two quick hacks so that my Feed On Feeds installation now outputs my feed list in three formats:

Down sides:

  • Generating the OPML was easy, but despite its ubiquity, I have no idea what will and won’t be able to read it.
  • Generating the XOXO was harder, there’s no hBlogroll microformat, so I’ve just copied bits of what Les Orchard has done, and no aggregator tools will be able to use it.
  • Generating the Atom was mostly easy, but mandates an updated element per entry, which would need a query the other two don’t and I needed to ensure that if there wasn’t a feed description, that I was generating something else in order to fill the mandated summary element. Also, no aggregator tools will be able to use it for importing a list of feeds.

Up sides:

  • My OPML might be able to be imported by other applications. Marvellous!
  • My XOXO file can be displayed on the web straight away, as-is. Marvellous!
  • My Atom file validates, so can certainly be parsed by any tool that understands Atom. Marvellous!


Subscription lists, three years on from when I first started using them, are just as crap as they were back then. If I were a tool writer now, starting from scratch, I’d be exporting and importing subscription lists in the form of Atom files. Any tool that wants to understand that file can transform it into whatever bastardised version of OPML it understands. I will definitely be adding Atom feed list import to my copy of Feed On Feeds.

On a related note, a few weeks ago Danny Ayers was talking about using for reading lists and in November Aristotle Pagaltzis published an XSLT for converting from API results to Atom.

I’ll leave you to join up the dots.

Published by

8 thoughts on “My subscriptions list in OPML, XOXO and Atom”

  1. The Atom version does seem nice and clean, especially compared to the others, and you’re right – I’ve run into uses of Atom that didn’t necessarily need the updated field and had to fake it before.

  2. Another option is XBEL – see, f.ex., the PlanetAtom subscription list. Uche Ogbuji wrote a bunch of entries on that; we discussed the option of using Atom as well, but rejected it because of atom:updated and the lack of a way to represent a hierarchical folder structure directly in the markup.

    One thing XBEL has in common with the other options you explored is that it already has some implementations – a number of browsers –, but support is far from ubiquitous.

  3. PS.: there’s no reason you can’t just used the current datetime as the value of atom:updated elements. Such an element is metadata about the entry in the feed but not necessarily about the alternate representation it points to.

  4. Yes, I knew about XBEL, and had read Uche’s posts and the following comments, but quite frankly, the last thing I wanted to do was start generating a format that in reality no-one is ever likely to use for this kind of thing.

    (and yes, my updated element is in fact just the timestamp for the export, and not the atual last updated timestamp for the feed, but doing that feels rather horrible – I do feel that if I’m describing a feed, I should probably be providing the last time it updated.

    Kevin, whilst Technorati Favourites should import my XOXO, I have no idea how exactly I’m supposed to specify it. It certainly fails to import the file I link to in my main post.

  5. For what it’s worth, Technorati Favorites seemed to enjoy my XOXO output. But, I’m not entirely sure what the significant difference is between yours and mine. In fact, yours would seem to be the better constructed XOXO, with more semantic cues.

  6. That’s interesting Les. Mine is a closer mapping of what you’d expect from Atom maybe.

    I was going to try adding class=”feed” to each of the feed links, but Technorati appear to have updated their import script so that mine works now. Nice!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.