Convert

CSV to XML Converter

Convert a CSV file into a row-shaped XML document. Useful for legacy systems, SOAP APIs, and anything that demands XML.

Most teams stopped emitting XML by default a decade ago, but plenty of consumers still demand it: legacy ERP systems, SOAP endpoints, government filing portals, and B2B integrations that were built before JSON was the assumption. If you're handed a CSV and asked to produce XML, this tool removes the in-between scripting step.

Output is a flat, row-shaped XML document — one `<row>` element per row, with one child element per column, named after your CSV header. Element names are sanitized so the output is always well-formed (XML names can't contain spaces, hyphens, or start with digits). Cell values get standard XML escaping. Conversion runs entirely in your browser.

How it works

Three steps, no signup

  1. 1

    Drop your CSV

    Drag a .csv file into the box above, or click to pick one. The first row is treated as the header row and used to name the column elements.

  2. 2

    We build the XML tree

    Each data row becomes a <row> element. Each cell becomes a child element named after its column header (sanitized for XML). Special characters in cell values are escaped.

  3. 3

    Download the .xml

    A well-formed UTF-8 XML document is ready instantly. Send it to your SOAP endpoint, paste it into a filing portal, or hand it to whatever consumer demanded XML.

FAQ

Frequently asked questions

What does the output XML look like?
Wrapped in a `<rows>` root, with one `<row>` per CSV row and one named child element per column. So a CSV with headers `name,email` and a row `Alice,alice@x.com` produces: <rows> <row> <name>Alice</name> <email>alice@x.com</email> </row> </rows> Indented two spaces. Encoded UTF-8.
How are column names sanitized?
Any character outside `[A-Za-z0-9_]` is replaced with an underscore. Names that would start with a digit get a leading underscore. So a header named `First Name` becomes the element `<First_Name>`, `2024 Q1` becomes `<_2024_Q1>`. This guarantees the output is well-formed XML — XML element names have stricter rules than CSV column headers.
What happens to special characters in cell values?
Standard XML escaping: `&` becomes `&amp;`, `<` becomes `&lt;`, `>` becomes `&gt;`, `"` becomes `&quot;`, `'` becomes `&apos;`. Newlines inside cells are preserved as literal newlines inside the element. The output is guaranteed to parse back as valid XML.
Why use XML instead of JSON for the same data?
Almost never by choice in 2026 — JSON is lighter, easier to read, and what most modern tools want. Use XML when the consumer requires it: a SOAP web service, an EDI-style B2B exchange, a government tax-filing portal, an XSLT-based publishing pipeline, or an ERP system with a hardcoded XML import schema. If you have a choice, pick JSON.
What if my CSV has duplicate column names?
Both columns get emitted as their own elements. So a CSV with two `id` columns produces two `<id>` elements per row. This is valid XML — the schema technically allows repeated child elements — but it's a smell. Rename duplicate columns in your CSV first if you want a cleaner output.
Are CDATA sections used for cells with markup-looking content?
No — we always use entity escaping (`&lt;` etc.), never CDATA wrapping. Entity escaping is universally understood by every XML parser and round-trips losslessly. CDATA can be slightly easier to read in a text editor but adds another set of edge cases (you can't put `]]>` inside a CDATA block). Entity escaping is the safer default.
Can I customize the root and row element names?
Not yet — v1 always uses `<rows>` as the root and `<row>` for each record. If you need a different schema (`<orders>` with `<order>` children, say), open the downloaded file in any text editor and find-and-replace the two element names. A future version will accept these as inputs on the page.

Need to compare two files?

Drop two spreadsheets and see every change in seconds. Free, private, runs in your browser.