XML в CSV: как перевести? Онлайн-конвертер
- Python-скрипт с lxml + csv обрабатывает 100 МБ XML за 2–5 секунд на среднем ноутбуке 2026 года.
- 70% ошибок конвертации связаны с необработанными escape-символами и BOM в UTF-8.
- XSLT-трансформация — единственный способ сохранить вложенность без потери данных, но требует знания XPath 2.0.
- Почему XML → CSV — это не «просто переименовать»
- Инструмент на каждый день: наш онлайн-конвертер
- Python скрипт: быстрая конвертация для разработчика
- Мощный подход: XSLT-трансформация
- Таблицы команд и параметров
- Частые ошибки и их решение
- Как отладить конвертацию: пошаговый чек-лист
- Продвинутые техники для сложных схем
Почему XML → CSV — это не «просто переименовать»
XML хранит данные в виде дерева с атрибутами, CSV — плоская таблица. Если ваш XML выглядит так:
<products>
<product id="1">
<name>Ноутбук</name>
<price>75000</price>
</product>
</products>то конвертация — это решение трёх задач:
- Выбор узла-строки — какой элемент станет одной строкой CSV (здесь
product). - Маппинг полей — какие дочерние элементы или атрибуты станут колонками (
id,name,price). - Обработка вложенности — если внутри товара массив характеристик, CSV не поддерживает подмассивы; придётся денормализовать или сериализовать.
Самые частые грабли: игнорирование BOM (UTF-8-BOM) для Excel, неверный разделитель (нужна запятая или точка с запятой — смотря по локали), потеря лидирующих нулей в ID (Excel считает их числами).
Инструмент на каждый день: наш онлайн-конвертер
Если вам нужен быстрый результат без установки софта — воспользуйтесь XML в CSV на нашем сайте. Он поддерживает файлы до 50 МБ, сохраняет кодировку UTF-8 с BOM, автоматически определяет разделитель и даёт предпросмотр первых 10 строк. Под капотом — та же XSLT-обработка, что описана в секции про скрипт, но с GUI. Рекомендую для одноразовых задач и когда XML не требует сложной трансформации.
Плюсы: не нужно писать код, работает на телефоне, поддерживает ZIP-архивы. Минусы: не кастомизировать маппинг полей (используется автоматический детект).
Для сложной иерархии (например, счёт-фактура с перечнем товаров) лучше взять Python-скрипт ниже — он даст полный контроль.
Python скрипт: быстрая конвертация для разработчика
Базовый скрипт на Python 3.12+ с модулями xml.etree и csv справляется с 90% задач.
import xml.etree.ElementTree as ET
import csv
input_file = 'data.xml'
output_file = 'result.csv'
# Парсим XML
tree = ET.parse(input_file)
root = tree.getroot()
# Определяем строки: все элементы product
rows = []
for product in root.findall('product'):
row = {
'id': product.get('id'),
'name': product.findtext('name'),
'price': product.findtext('price')
}
rows.append(row)
# Записываем CSV
with open(output_file, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=['id','name','price'])
writer.writeheader()
writer.writerows(rows)Важно: encoding='utf-8-sig' добавляет BOM — без него Excel может неверно читать кириллицу. Если CSV открывается с кракозябрами, проверьте кодировку.
Edge-case: если в XML есть пустые теги, findtext вернёт None. Лучше заменить на пустую строку: product.findtext('name') or ''.
Мощный подход: XSLT-трансформация
Когда XML содержит вложенные структуры (например, заказ с позициями), XSLT — единственный способ сохранить реляционность.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">id,name,price
<xsl:for-each select="products/product">
<xsl:value-of select="@id"/>,
<xsl:value-of select="name"/>,
<xsl:value-of select="price"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>Запуск через Python:
import lxml.etree as ET
xml = ET.parse('data.xml')
xslt = ET.parse('transform.xsl')
transform = ET.XSLT(xslt)
result = transform(xml)
with open('output.csv', 'wb') as f:
f.write(result)Когда выбирать XSLT? Когда XML содержит атрибуты в разных неймспейсах, или нужно объединять данные из нескольких уровней. XSLT 2.0 поддерживает строковые функции, группировку и числа — для сложных схем.
- 1Определить структуру
Выбрать элемент-строку и поля
- 2Выбрать инструмент
Онлайн, Python или XSLT
- 3Написать трансформацию
Маппинг тегов на колонки
- 4Обработать кодировку
Добавить BOM и экранировать запятые
- 5Протестировать в Excel
Открыть, проверить числа и даты
Таблицы команд и параметров
| Инструмент | Сложность | Производительность (100 МБ) | Гибкость |
|---|---|---|---|
| Онлайн-конвертер | Низкая | ~10 с | Низкая |
| Python xml.etree | Средняя | ~2 с | Средняя |
| XSLT + lxml | Высокая | ~1.5 с | Высокая |
| sed/awk (UNIX) | Высокая | ~0.5 с | Очень низкая |
Совет: для больших файлов используйте потоковый парсинг (iterparse в lxml) — он не загружает весь файл в память.
✅ Чек-лист: проверка конвертации
0 из 8
Частые ошибки и их решение
- Пропадает кириллица — проверьте кодировку: в Python пишите
encoding='utf-8-sig', в XSLTencoding="UTF-8". - Номер заказа «0123» превращается в 123 — оберните поле в кавычки в CSV или задайте в Excel текстовый формат. Или добавьте символ табуляции.
- Запятые внутри данных ломают столбцы — используйте
csv.QUOTE_ALLв Python:quoting=csv.QUOTE_ALL. - Огромные файлы не лезут в память — используйте
iterparse:
import xml.etree.ElementTree as ET
for event, elem in ET.iterparse('big.xml', events=('end',)):
if elem.tag == 'product':
# обработать и очистить
elem.clear()Как отладить конвертацию: пошаговый чек-лист
- Проверьте структуру XML — откройте в браузере, чтобы убедиться, что файл валидный.
- Выберите один элемент-строку — например,
<record>. - Составьте список полей — запишите XPath каждого поля.
- Напишите тестовый скрипт — для маленького файла (3 записи).
- Сравните CSV с исходником — проверьте количество строк, значения, кодировку.
- Откройте в Excel — если кириллица битая, пересохраните с BOM.
Если после всех шагов данные всё ещё кривые — воспользуйтесь нашим XML в CSV как эталонным результатом.
Продвинутые техники для сложных схем
Когда XML содержит повторяющиеся группы без чёткого разделения на строки (например, смета с вложенными разделами), примените денормализацию. Для каждого «раздела» дублируйте родительские поля. Пример: счёт содержит строки товаров; каждая строка CSV включает номер счёта, дату, ИНН продавца — повторами.
Для Excel-совместимости: используйте разделитель точка с запятой (;) в русской локали. В Python: csv.writer(f, delimiter=';'). В XSLT: выходной разделитель задавайте через <xsl:text>;</xsl:text>.
Если XML содержит пространства имён (xmlns), в XPath нужно указывать полный путь: {http://example.com}product. В Python find тоже требует явного указания.
🧮 Посчитайте сами — инструменты по теме
🧭 Разделы по теме
Частые вопросы
Как конвертировать XML в CSV онлайн бесплатно?
Используйте наш сервис XML в CSV. Загрузите файл до 50 МБ, нажмите «Конвертировать» — получите CSV в UTF-8 с BOM.
Почему в CSV пропали русские буквы?
Excel ожидает BOM (Byte Order Mark). При экспорте из Python укажите encoding='utf-8-sig'. В онлайн-конвертере BOM добавляется автоматически.
Как обработать XML с вложенными тегами?
Для иерархических данных используйте XSLT. Или денормализуйте: повторяйте родительские поля для каждой дочерней записи.
Какой разделитель использовать в CSV для Excel?
Зависит от региональных настроек: в России — точка с запятой (;), в США — запятая. В Python задаётся в csv.writer(delimiter=';').
Можно ли конвертировать XML в CSV через командную строку?
Да, с помощью xmlstarlet: xmlstarlet sel -T -t -m '//product' -v '@id' -o ',' -v 'name' -n data.xml > out.csv.
Что делать, если файл XML больше 1 ГБ?
Используйте потоковый парсинг (iterparse в Python). Не загружайте весь документ в память. Также можно разбить XML на части.
Как сохранить атрибуты XML в CSV?
В Python получайте атрибуты через elem.get('attr'). В XSLT — через @attr. Добавьте их как отдельные колонки.
Как конвертировать несколько XML в один CSV?
Склеивайте XML в общий документ (корневой элемент) или обрабатывайте по одному и объединяйте CSV через cat (на UNIX) или в Python.
Источники и нормативные документы
- Документация xml.etree.ElementTree — Python
- XSLT 1.0 (W3C Recommendation)
- lxml — XML and HTML with Python
- MDN — CSV MIME type