Convert an RSS feed to CSV
Turn a feed, a product export or an RSS file into a spreadsheet table. The repeating record element is found for you, no XPath required.
Drop your files here
.xml, .rss, .xhtml, .txt · up to 300 MB
More settingsFewer settings
How to Convert to CSV
- 1
Drop your XML file
Drag an .xml or .rss file onto the page. It is validated first, so a missing closing tag is reported with its line and column instead of half a table.
- 2
Confirm the record element
The repeating element is detected and shown with how many records it holds, such as rss.channel.item with forty. Pick a different candidate if that is not the level you wanted.
- 3
Convert and download the CSV
Press the button and save the table.
Rows are posts, not tags
The page opens with rss.channel.item under “Repeating element”, the path to the posts of an RSS 2.0 feed. The main XML to CSV page starts at auto. Auto picks the element that repeats most, but it looks inside the first post only. A WordPress feed holds 10 posts by default, and each category or tag of a post is a category element. On October 21, 2026, we tried a 10-post feed whose first post had 12 tags. Auto gave 30 rows of tag names; the preset gave 10 rows and 15 columns. The page does not name the path it used, so count the rows.
What each post turns into
Each element of a post becomes a column: title, link, pubDate, creator, category, guid, description and encoded. Podcast feeds add enclosure.@url, enclosure.@length and enclosure.@type. A post's tags share one cell, such as “Gardening, Tomatoes, Seeds”. “One column per item” under “More settings” gives each tag a column. Dates stay as the feed wrote them: Mon, 19 Oct 2026 08:00:00 +0000. The HTML of description and content:encoded arrives as is, entities such as … included.
Two things to watch in WordPress feeds
When comments are open, WordPress gives each post a comments link and a slash:comments count. “Drop namespace prefixes” is on at the start, so both become comments and share a cell: “…/#respond, 1”. Turn it off under “More settings” to keep them apart; other names then keep prefixes, as in dc:creator. Long posts are the other thing. On October 21, 2026, the WordPress News feed, 10 posts and 293 kB, became 10 rows and 11 columns in 0.14 seconds. Microsoft puts the limit of an Excel cell at 32,767 characters. The HTML of two posts ran past it, the longer to 127,278.
Atom feeds, several feeds and the result
An Atom feed keeps its posts under feed.entry. Here it gets the answer “This XML has no repeating element, so there are no rows to build.” Type feed.entry or auto and press “Try again”. Atom links and categories sit in attributes: “Join into one cell” leaves a lone comma, “One column per item” keeps them. The page reads a saved .xml or .rss file, not a feed address. Up to 20 feeds, 300 MB in all, arrive as pulsarkit-batch.zip, one CSV each. Nothing is uploaded, and CSV to Excel turns the CSV into a workbook.
Nothing is uploaded to convert it
The validator, the parser and the CSV writer are all JavaScript running in this browser tab. No part of your document is sent to a server or logged, and the tool keeps working with the network switched off. To continue in another tool, PulsarKit may store a local copy of your input or result in this browser. It can remain after you close the tab or restart the browser. Clear PulsarKit’s site data to delete it.
Frequently asked questions
How does the tool decide which element is a record?
It counts repeats. Every path down to depth six is examined for same-named sibling elements, and the path with the most of them becomes the record; if two paths tie, the deeper one wins. The alternatives stay visible with their counts, and you can also type a path yourself when the document is unusual.
Where do XML attributes end up?
Each attribute becomes a column named with an @ prefix, so an id attribute is @id and stays distinct from an id child element. If your export carries attributes you do not need, switching attributes to skip drops them all and leaves a narrower table.
What happens to elements nested inside a record?
They become dot-named columns such as price.currency, down to the depth limit you set. Below that limit the whole subtree is written into a single cell as JSON, which keeps the data available without producing thousands of near-empty columns.
Why does the CSV start with a byte order mark?
So Excel recognises the file as UTF-8 on a double click instead of guessing a legacy code page and mangling accented or Cyrillic text. If the file is destined for a script or a database loader that dislikes the marker, plain UTF-8 is one setting away.
Excel shows everything in one column. What went wrong?
Nothing in the file. Excel splits on the separator from your system locale, which is the semicolon in much of Europe. Convert again with semicolon selected, or use Data then Text to Columns on the file you already have.
Does this work on an RSS or Atom feed?
Yes, that is the easiest case. Detection lands on rss.channel.item or the equivalent entry element on its own, each item becomes a row, and namespaced extensions such as Dublin Core or media tags arrive as ordinary columns once prefixes are stripped.
Why did a quote appear before a value starting with an equals sign?
Because a spreadsheet would otherwise treat it as a formula, and a value from an untrusted feed can be crafted to run a command when the file is opened. A leading apostrophe neutralises it. Plain negative numbers such as -5 are left untouched.
My file has a DOCTYPE and it was refused. Why?
A DOCTYPE that declares entities is refused on purpose. Nested entity definitions can expand into gigabytes of text and freeze the tab, and external ones can reach for files elsewhere. Remove the entity declarations from the DOCTYPE and the document converts normally.