Skip to main content
PulsarKit

Convert XML to Excel

Turn an XML feed or system export into a spreadsheet. The repeating record element is found for you, and attributes become their own columns.

Drop your files here

.xml, .rss, .xhtml, .txt · up to 300 MB

More settings

How to Convert to Excel

  1. 1

    Drop an XML file

    Feeds, catalogues and system exports are all read locally. RSS, plain XML and XHTML are accepted.

  2. 2

    Confirm the detected record element

    The most-repeated path becomes the row. Override it if your file nests records somewhere unusual.

  3. 3

    Convert and download the XLSX

    You get one row per record with a frozen header, ready to filter and sort.

Finding what counts as a row

XML has no notion of a table, so the first real question is which element is a record. The document tree is walked and, for every node, the number of identically named children is counted; the path with the most repetitions wins, and ties go to the deeper path because deeper is more specific: rss.channel.item is a more useful answer than rss.channel. That heuristic is right on feeds and catalogues nearly every time, but it is only a heuristic, which is why the path is an editable field rather than a hidden decision. A 1C export where both Document and TableRow repeat is exactly the case where only you know which one you meant.

Attributes, namespaces and nesting

An attribute carries data just as an element does, so id="7" becomes a column named @id and a nested currency="EUR" becomes sum.@currency. You can change the prefix or drop attributes entirely. Namespace prefixes are stripped by default so that dc:title lands in a column called title, which is what almost everyone wants when they open the sheet; turn that off and the prefixed name is preserved. Nested elements flatten into dot-named columns up to the depth you allow, and anything deeper is stored as compact JSON rather than exploding the sheet sideways.

Entity declarations are refused, not expanded

An XML file may declare its own entities inside a DOCTYPE, and expanding them is how the billion laughs attack exhausts memory and how XXE reads files off a server. There is no safe way to expand an untrusted entity and no good reason to try for a spreadsheet conversion, so a document with an ENTITY declaration is rejected before parsing begins, with a message saying exactly why. Remove the DOCTYPE and the rest of the file converts normally.

Parsed here, not on a server

Decoding, validating and converting all happen inside this browser tab using a parser written for this purpose. Nothing is uploaded, and the refusal to expand external entities means no part of the file can reach out anywhere either.

Frequently asked questions

How is the repeating element chosen?

By counting identically named siblings throughout the document and taking the path with the most of them, preferring the deeper path when two tie. The chosen path is shown and can be replaced with any path you type.

Where do attributes end up?

In their own columns, prefixed with @ by default, so @id for an attribute on the record and sum.@currency for one on a nested element. You can change the prefix or skip attributes entirely.

What happens to nested elements?

They become dot-named columns such as order.customer.city, down to the depth limit you set. Anything deeper is written as a compact JSON string in a single cell rather than expanding into more columns.

What about namespaces?

Prefixes like dc: are removed by default, so dc:title becomes a column named title. If two namespaces genuinely use the same local name in your file, turn stripping off to keep them apart.

Does RSS work?

Yes, and it is the case the detection handles best: rss.channel.item is found automatically, giving one row per feed entry with title, link and pubDate as columns.

What is the row limit?

1,048,576 rows, which is a limit of the XLSX format itself. A larger feed is refused with a link to the CSV converter, which has no such ceiling.

Is my file uploaded?

No. The file is decoded, parsed and converted inside your browser, and declared entities are refused outright rather than expanded, so nothing in the document can trigger a network request either.

Related tools