Skip to content

v0.10.0 — real XML mode (RSS/Atom, sitemaps)

Choose a tag to compare

@github-actions github-actions released this 26 Jul 18:17
· 11 commits to main since this release

Real XML mode — RSS/Atom feeds, sitemaps, SVG, OPML now parse correctly.

HTML parsers silently mangle XML: <link> is a void element in HTML, so every RSS item's URL is lost (try pup 'item link' or htmlq 'item link' on any feed — nothing comes back); pubDate gets lowercased; namespaces are mishandled. cull now detects XML (an <?xml…?> declaration or a known root: <rss>, <feed>, <urlset>, <sitemapindex>, <opml>, <svg>) and parses it with a real XML parser. Every feature just works on it: CSS selection, -j templates, -t, -p, --json-nodes, -i, multiple inputs.

A feed reader is now one line:

$ cull item -j '{title: title, url: link, date: pubDate}' https://lobste.rs/rss
{"title":"A shell colon does nothing. Use it anyway","url":"https://refp.se/…","date":"Sat, 25 Jul 2026 06:33:00 -0500"}

Details:

  • --xml forces XML parsing (malformed XML → hard error, exit 2); --html forces HTML; auto-detection is per input, and auto-detected-but-malformed input warns and falls back to the forgiving HTML parser
  • In XML mode selectors are case-sensitive, as XML requires: pubDate matches <pubDate> only
  • Namespaced tags keep their prefix — select with an escaped colon: cull item -j '{thumb: media\:thumbnail @url}' https://feeds.bbci.co.uk/news/rss.xml
  • -t puts each XML field on its own line; serialization keeps <link> children intact
  • Charset sniffing now honors <?xml version="1.0" encoding="…"?> (after BOM and Content-Type, before <meta charset>)
  • Sitemaps: cull 'url > loc' -t https://blog.rust-lang.org/sitemap.xml (and sitemap > loc for sitemap indexes)

162 tests. See the cookbook §11 for live-verified recipes, and the CHANGELOG.