— Documentation
How does it work?
The complete workflow: XML transformation → CSV editing → XML reconstruction, 100% online. No third party, no storage, no install.
Quick start
Drop your XML, get back an .excelify file (ZIP), edit the CSV in Excel/Numbers/Sheets, reconstruct the XML in one click. Unlimited reconstructions — you pay only to analyze the structure.
Overview
ExcelifyXML analyzes your XML structure, generates an editable CSV + a manifest describing the original structure, and lets you rebuild the XML online after editing.
Drop your XML file. Our v13 algorithm auto-detects the row tag, handles multi-locale, SFCC attributes, and nested wrappers.
You get a single ZIP file containing: data.csv (your editable data) and skeleton.json (the XML structure).
Edit the CSV wherever you want. Rebuild the XML via /reconstruct — online, on any OS. No limit on reconstructions.
XML ↔ CSV round-trip
Rebuild your XML after editing directly on the site: drop your edited bundle, get the XML back.
Web reconstruction
Drop your edited .excelify on the /reconstruct page. The server reads the manifest, applies your changes, returns the reconstructed XML. Works on Mac, Linux, Windows, Chromebook. No setup.
Why a manifest?
skeleton.json carries everything a flat CSV can't: root, namespaces, encoding, intermediate wrappers, element order, inherited attributes. Without it, the structure would be lost. It's what makes the round-trip faithful. Never edit it.
Unlimited reconstructions
One transformation = 1 credit = 1 manifest. With that manifest, edit your CSV and rebuild the XML as many times as you want, for free. You pay to analyze the structure, not to regenerate it.
CSV File Structure
The generated CSV uses a special naming convention to preserve the XML structure:
| Pattern | Signification | Exemple |
|---|---|---|
@attribute | Direct attribute on element | @category-id → ‹category category-id="..."› |
element[lang] | Element with xml:lang attribute | display-name[fr] → ‹display-name xml:lang="fr"›...‹/display-name› |
element[id] | Element with attribute-id (custom-attributes) | custom-attribute[showInMenu] → ‹custom-attribute attribute-id="showInMenu"›... |
parent.child | Nested element | page-attributes.page-title[x-default] → ‹page-attributes›‹page-title›... |
tag[N].sub | Repeated element (0-indexed) | skill[0].@name = 1st ‹skill›, skill[1].@name = 2nd ‹skill› |
ancestor.@attr | Attribute of an ancestor element (denormalized context) | company.@country → ‹company country="FR"›‹employees›... |
tag[id][lang] | Multi-qualifier (Salesforce Commerce + multilingual) | custom-attribute[seo_url][fr] → ‹custom-attribute attribute-id="seo_url" xml:lang="fr"›... |
@attributeDirect attribute on element
@category-id → ‹category category-id="..."›element[lang]Element with xml:lang attribute
display-name[fr] → ‹display-name xml:lang="fr"›...‹/display-name›element[id]Element with attribute-id (custom-attributes)
custom-attribute[showInMenu] → ‹custom-attribute attribute-id="showInMenu"›...parent.childNested element
page-attributes.page-title[x-default] → ‹page-attributes›‹page-title›...tag[N].subRepeated element (0-indexed)
skill[0].@name = 1st ‹skill›, skill[1].@name = 2nd ‹skill›ancestor.@attrAttribute of an ancestor element (denormalized context)
company.@country → ‹company country="FR"›‹employees›...tag[id][lang]Multi-qualifier (Salesforce Commerce + multilingual)
custom-attribute[seo_url][fr] → ‹custom-attribute attribute-id="seo_url" xml:lang="fr"›...Best practices
For the XML reconstruction to work correctly, respect these rules.
What you can do
- Edit cell values (titles, descriptions, prices...)
- Add rows to create new XML elements
- Delete rows to remove elements from the final XML
- Filter or sort — output respects the current order
What you must never do
- Modify headers (first row) — these are XML paths
- Change a column's data type (text ↔ number)
- Save in a format other than CSV — the re-imported file must stay data.csv
- Merge cells or add extra sheets
Troubleshooting
"Field order canonical" warning shown
Solution : Informational, not an error. Your XML rows had different field orderings. We used the order of the first row as reference. The reconstructed XML is still 100% valid — field order has no semantic meaning for Google, Akeneo, SFCC or Magento.
"Empty tags not preserved" warning shown
Solution : Your XML contains tags like <sale_price/> or <upc/> (empty, self-closing). In practice this isn't a problem: WooCommerce, PrestaShop, Magento, Akeneo and other import systems treat a missing field as "do not modify the existing value" — the same behavior as an empty tag. If you want to force a clear on import, put "0" or a space in the cell.
Reconstructed XML differs from the original
Solution : Without modifications on your end, the reconstructed XML should be structurally identical. If it isn't (element order, missing attributes), contact support with the original file — that's a bug to fix.
Still stuck?
Our team responds within 24 business hours. You can also try another file in the meantime.
