Cadenhead: OPML is a Kludge
Rogers Cadenhead, member of the RSS Advisory Board, has some interesting things to say about OPML. These same things have been said by others, but Cadenhead’s new-found fame as the guy who was sued by Dave Winer gives him a louder megaphone. Some of the pointier parts:
“OPML’s an underspecified, one-size-fits-all kludge that doesn’t serve a purpose beyond the exchange of simple data.”
“There’s little need for an XML dialect to represent outlines.”
“OPML’s also the only XML dialect I’m aware of that stuffs all character data inside attributes.”
This last bit is particularly condemning of OPML as a “serious” format. Without getting too deep into the attribute-vs-element war, here are a couple of reasons why attributes are a lousy place to stuff arbitrary data:
- Attributes can’t distinguish between
nullandempty string. This is because they must be assigned a value using="". For example:<foo bar="" />Elements, however, can either have no child text element (null) or an empty string child text element. For example:
<foo><bar/></foo>
or
<foo><bar></bar></foo> - Attributes can’t contain complex character data. Cadenhead points out some gnarly examples of trying to stuff HTML or XML information into an attribute. Even a single unescaped entity (like a < sign) can burn you.
Elements, on the other hand, can have a CDATA block to hold any character data you like, unescaped or not.
None of this should be news to developers using OPML, but sometimes it takes the right people repeating the truth for things to change.

“OPML’s an underspecified, one-size-fits-all kludge that doesn’t serve a purpose beyond the exchange of simple data.”
May 3rd, 2006 at 12:35
Looks like it’s all settled.
OPML has bugged me for a while, as does rss. The weirdness that travels with Winer has convinced me I’m going to shun both of them as much as possible.
May 3rd, 2006 at 16:17
Yeah, for all Winer is hailed as some kind of visionary, RSS2 and OPML are just horrible. Though, I do disagree with Cad on one point:
== bar is null
is bar.
The problem there, though, is you have to accept that “bar” is an expected value, which you can’t with the specification. While there are… consensus… definitions of what people expect from OPML, all in all it is crap.