CSV to XML Converter
Convert CSV to XML. Parses real CSV grammar — quoted fields with embedded commas, newlines and escaped double-quotes — with a comma, semicolon, tab or pipe delimiter (or auto-detect), and builds properly-indented, XML-escaped XML with customizable root/row element names. Runs entirely in your browser.
Input
Options
On: header values become each row's XML element names. Off: generic field1, field2, …
Sanitized to a valid XML name: letters, digits, underscore — can't start with a digit.
Sanitized the same way as the root element name.
Output
Guides
Turn CSV data into well-formed XML in your browser — no upload, no spreadsheet software required. Paste rows copied from Excel, Google Sheets, or a database export, and get back properly-indented, escaped XML ready to drop into a config file, an API payload, or a legacy system that only speaks XML.
How to use it
- Paste your CSV into the input box, or drop a
.csvfile onto the uploader. - Choose the delimiter — comma, semicolon, tab or pipe — or leave it on Auto-detect to have the tool guess from the first line.
- Toggle First row contains headers to control where each row's element names come from: on, the header row's values become the element name for that column in every row; off, columns are named generically (
field1,field2, …). - Set the root element name and row element name — these wrap the whole document and each record respectively (default
<rows>/<row>). - Pick an indent — 2 spaces, 4 spaces, tab, or minified — and copy or download the result as
converted.xml.
The output updates automatically as you type.
How is quoting handled?
The parser follows the real CSV grammar (RFC 4180), not a naive comma split. A field wrapped in double quotes can safely contain the delimiter, a line break, or a literal double quote written as "" — for example "Smith, John" parses as one field containing a comma, and a quoted field can even span multiple lines. That means real-world exports from Excel or Google Sheets, which routinely quote fields for exactly this reason, convert correctly instead of silently splitting a value in two.
Is the XML actually safe to use?
Yes — every field value is escaped for XML (&, <, >, " and '), so a CSV cell containing something like Tom & Jerry <sample> becomes Tom & Jerry <sample> in the output rather than producing broken or maliciously-shaped markup. This matters most for CSV exported from user-facing systems (support tickets, form submissions, free-text notes), where you can't assume the content is XML-safe to begin with.
What happens to column names that aren't valid XML?
Header values become element names, so they're sanitized into valid XML names first: spaces and punctuation turn into underscores, and a name that would otherwise start with a digit (or end up empty) gets a leading underscore instead. "2nd Score" becomes <_2nd_Score>, "First Name" becomes <First_Name>. The same sanitizing applies to your root and row element names.
Auto-detect vs. picking the delimiter manually
Auto-detect looks at the first line and picks whichever of comma, semicolon, tab or pipe appears most often outside quoted text — reliable for typical exports, but pick the delimiter explicitly if your data is unusual (for example, a single-column file where every candidate delimiter is equally absent, which auto-detect resolves to comma).
What if a row has more or fewer fields than the header row?
With headers on, a short row's missing trailing columns are simply omitted from that row's XML; a long row's extra fields beyond the last header are dropped. This keeps ragged, hand-edited CSV exports from throwing an error.
Is my data uploaded anywhere?
No. Parsing and XML generation both run entirely in your browser using a self-contained CSV parser — your data, including anything sensitive in a customer or financial export, is never sent to a server, logged, or stored.
What's the inverse of this tool?
There's no dedicated XML-to-CSV converter yet, but the CSV to JSON Converter uses the same delimiter options and RFC 4180 quoting if you need a different structured format instead.