Чтобы создать файл XML, откройте любой текстовый редактор, впишите первой строкой декларацию <?xml version="1.0" encoding="UTF-8"?>, а под ней один корневой тег, внутри которого лежат все данные. Сохраните файл с расширением .xml в кодировке UTF-8 и откройте его в браузере: если вместо дерева тегов появилась ошибка, браузер покажет строку, где она сидит.
Ниже пошагово разберём Блокнот и VS Code, выгрузку таблицы из Excel и сборку файла на Python, а в конце соберём ошибки, на которых новички теряют больше всего времени. Что такое сам формат и чем он отличается от HTML, мы подробно разобрали в статье «Что такое XML простыми словами».
SkillboxPHP-разработчик. Базовый уровень83 541 ₽3 месяца
НетологияПрофессия «Java-разработчик с нуля»118 500 ₽11 месяцев
GeekBrainsПрофессия 1С-разработчик117 249 ₽8 месяцев
SkillFactoryPython для веб-разработки114 840 ₽9 месяцев- Android-разработка на Kotlin69 800 ₽4 месяца
Академия ТОП1С-программист + ИИ: автоматизация и отчетностьБесплатно9 месяцев
Как создать XML-файл в Блокноте за пять шагов

Специальная программа не нужна: XML состоит из обычного текста с тегами. Подойдёт Блокнот в Windows и TextEdit на Mac.
- Откройте Блокнот и вставьте текст файла (пример ниже).
- В меню «Файл» выберите «Сохранить как».
- В списке типа файла выберите «Все файлы», иначе Блокнот допишет к имени
.txt. - Наберите имя с расширением, например
products.xml. - Проверьте, что в списке кодировок стоит UTF-8, и нажмите «Сохранить».
Вот минимальный рабочий пример: каталог из двух товаров. У каждого товара есть атрибут sku с артикулом, вложенные теги с названием и ценой.
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product sku="A-101">
<name>Блокнот в клетку</name>
<price currency="RUB">250</price>
</product>
<product sku="A-102">
<name>Ручка гелевая</name>
<price currency="RUB">90</price>
</product>
</products>
С кодировкой в Блокноте обычно ничего делать не надо. Microsoft ещё в 2018 году сделала UTF-8 без метки BOM вариантом по умолчанию для новых файлов и вывела кодировку в строку состояния. Как ещё сохранять файлы с нужным расширением, рассказали в инструкции по Блокноту Windows.
TextEdit на Mac умеет хранить форматированный текст, а XML нужен простой. Перед сохранением выберите «Формат» → «Конвертировать в простой текст», потом сохраняйте с расширением .xml.
Как создать XML в VS Code с подсветкой тегов
В Блокноте легко пропустить закрывающий тег. Редактор кода подсвечивает теги и атрибуты разными цветами, рисует линии вложенности и сам ставит отступы, поэтому ошибку видно ещё до сохранения.
Скриншоты ниже сделаны в vscode.dev, браузерной версии VS Code. Она открывается без установки, а меню и строка состояния там те же, что в программе на компьютере.
- Нажмите «Создать файл…» на стартовой вкладке и выберите текстовый файл.
- Щёлкните по надписи «Простой текст» справа в строке состояния, наберите XML и выберите язык из списка.
- Вставьте или наберите текст, затем сохраните файл с расширением .xml.

Если сразу сохранить файл под именем с .xml, VS Code сам включит режим XML, второй шаг можно пропустить. В строке состояния справа видно язык файла, кодировку и номер строки, на которой стоит курсор.

Для больших файлов пригодится бесплатное расширение XML от Red Hat: оно подсказывает теги, форматирует документ и проверяет его по схеме. Если VS Code у вас ещё не стоит, начните с инструкции, как создать и запустить файл в VS Code.
Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяИз чего состоит правильный XML-файл

Браузеры прощают HTML кривую разметку. XML не прощает ничего: одна незакрытая скобка, и файл не прочитается целиком. Правила задаёт спецификация XML 1.0 от W3C, вот те, на которых чаще всего ошибаются.
| Правило | Правильно | Ошибка |
|---|---|---|
| Ровно один корневой элемент | <products>…</products> вокруг всех товаров |
два тега <product> на верхнем уровне |
| Каждый тег закрыт | <name>…</name> или <br/> |
<name>Блокнот без пары |
| Регистр имён совпадает | <products>…</products> |
<Products>…</products> |
| Значения атрибутов в кавычках | sku="A-101" |
sku=A-101 |
| Спецсимволы заменены | & вместо &, < вместо < |
голый & в тексте |
| Декларация в самом начале | <?xml …?> на первой строке |
пустая строка или пробел перед ней |
Сама декларация <?xml?> по спецификации не обязательна: там сказано, что документ «следует» с неё начинать. Но ставить её стоит, потому что в ней записана кодировка. Без неё программа считает текст UTF-8, и файл в другой кодировке прочитается кракозябрами.
Имена тегов вы придумываете сами. Договорённость одна: теги описывают смысл данных, а не внешний вид. Поэтому <price> лучше, чем <b>.
Как проверить XML-файл на ошибки
Быстрее всего перетащить файл в окно Chrome, Яндекс Браузера или Firefox. Правильный файл браузер покажет деревом: теги можно сворачивать треугольниками слева.

Если в файле ошибка, вместо дерева появится сообщение с номером строки и столбца. Ниже мы оставили в названии товара голый амперсанд: «Блокнот & ручка».

Кадры сделаны в Chrome с английским интерфейсом, поэтому подписи на них по-английски. На втором кадре смотрите на координаты: строка 4, столбец 20. Чтобы исправить ошибку, достаточно заменить & на &.
Когда файлов много, удобнее проверять их скриптом. В Python для этого есть встроенный модуль xml.etree.ElementTree, ничего ставить не нужно:
import xml.etree.ElementTree as ET
for path in ["products.xml", "broken.xml"]:
try:
ET.parse(path)
print(path, "— ошибок нет")
except ET.ParseError as err:
print(path, "—", err)
Вывод на наших двух файлах:
products.xml — ошибок нет
broken.xml — not well-formed (invalid token): line 4, column 19
Столбец здесь на единицу меньше, чем у браузера, потому что Python считает столбцы с нуля, а браузер с единицы. На macOS и в Linux есть ещё утилита xmllint: команда xmllint --noout broken.xml печатает строку с ошибкой и ставит под неё стрелку.
Проверка по схеме XSD
Браузер и ET.parse() проверяют только синтаксис. Им всё равно, что в теге цены написано «девяносто» вместо числа. Чтобы ловить и такие ошибки, к файлу пишут схему XSD: отдельный XML-файл, где перечислены разрешённые теги, их порядок и типы значений. Для нашего каталога в схеме сказано, что в <price> лежит десятичное число, а атрибут sku обязателен.
Проверка по схеме в xmllint запускается одной командой:
xmllint --noout --schema products.xsd products.xml
На правильном файле утилита отвечает products.xml validates. Мы заменили цену второго товара словом, и проверка ответила так:
bad-price.xml:9: element price: Schemas validity error : Element 'price': 'девяносто' is not a valid value of the atomic type 'xs:decimal'.
bad-price.xml fails to validate
Схемы XSD нужны там, где файл читает чужая программа: банк, маркетплейс, налоговая. Обычно схему даёт сам получатель, писать её с нуля приходится редко. Читать схемы и разбирать чужие выгрузки учат на курсах веб-разработки.
Как сохранить таблицу Excel в XML
Excel умеет выгружать данные в XML, но только через карту XML. Это описание того, какой столбец таблицы в какой тег попадает. Без карты пункт «Данные XML» в окне сохранения выдаст ошибку, что в книге нет сопоставленных диапазонов. Порядок по справке Microsoft:
- Включите на ленте вкладку «Разработчик», если её нет.
- На вкладке «Разработчик» откройте область задач «Источник XML», выберите «Сопоставления XML» и нажмите «Добавить».
- Укажите файл схемы .xsd или образец .xml. Из образца Excel попробует вывести схему сам, так что пример из этой статьи тоже подойдёт.
- Перетащите элементы из области «Источник XML» на столбцы таблицы.
- Нажмите на вкладке «Разработчик» кнопку экспорта, в окне «Экспорт XML» введите имя файла и нажмите «Экспорт».
У экспорта есть потолок: в XML-файл Excel сохраняет до 65 536 строк. Таблицу длиннее придётся резать на части или выгружать скриптом. Кадров здесь нет: в Google Таблицах, нашем обычном браузерном аналоге Excel, выгрузки в XML нет вовсе.
Если карта кажется громоздкой, есть путь проще. Сохраните таблицу в CSV, а XML соберите из неё на Python. Как читать CSV в коде, мы показали в статье про формат CSV.
Как создать XML-файл на Python
Когда данные лежат в списке, базе или CSV, файл выгоднее не набирать, а собрать кодом. Хватит базового Python и встроенного модуля. Тот же каталог из двух товаров:
import xml.etree.ElementTree as ET
items = [("A-101", "Блокнот в клетку", 250), ("A-102", "Ручка гелевая", 90)]
root = ET.Element("products")
for sku, name, price in items:
product = ET.SubElement(root, "product", sku=sku)
ET.SubElement(product, "name").text = name
ET.SubElement(product, "price", currency="RUB").text = str(price)
tree = ET.ElementTree(root)
ET.indent(tree, space=" ")
tree.write("products_py.xml", encoding="utf-8", xml_declaration=True)
Скрипт запишет рядом с собой файл products_py.xml. Его содержимое:
<?xml version='1.0' encoding='utf-8'?>
<products>
<product sku="A-101">
<name>Блокнот в клетку</name>
<price currency="RUB">250</price>
</product>
<product sku="A-102">
<name>Ручка гелевая</name>
<price currency="RUB">90</price>
</product>
</products>
Три детали, которых обычно нет в коротких примерах:
- Кодировку передавайте явно. По умолчанию
write()пишет в ASCII, и вместо «Блокнот» в файле окажетсяБл…. Программа такой файл прочитает, а человеку его читать неудобно. - Отступы даёт
ET.indent(). Функция появилась в Python 3.9, без неё весь файл уйдёт в одну строку. - Кавычки в декларации одинарные. Для XML это нормально, обе формы верны.
Если Python у вас ещё не установлен, начните с инструкции по установке Python на Windows, macOS и Linux, а первые программы разберите по статье с примерами кода для начинающих.
XML для налоговой и ЭДО: почему его не пишут руками
Часто «как создать XML» ищут бухгалтеры: декларации, счета-фактуры и УПД уходят в налоговую и контрагентам как XML-файлы. Здесь самодельный файл не пройдёт. Состав и порядок тегов для каждого документа задаёт формат ФНС, и файл с лишним или пропущенным тегом не примут.
- Отчётность формирует учётная программа или бесплатная программа ФНС «Налогоплательщик ЮЛ»: она готовит документы для подачи в налоговые органы в электронном виде.
- Счета-фактуры и УПД для контрагентов выгружает система электронного документооборота, через которую вы их отправляете.
Открыть такой файл в Блокноте и посмотреть, что внутри, можно. Править вручную не стоит: одна опечатка в атрибуте, и документ вернётся с отказом.
Частые ошибки и как их исправить

Все сообщения в таблице мы получили сами, когда проверяли испорченные копии примера через xmllint и Python.
| Что пишет проверка | Причина | Что сделать |
|---|---|---|
XML declaration allowed only at the start of the document |
перед <?xml?> стоит пустая строка или пробел |
удалить всё, что выше декларации |
Extra content at the end of the document / junk after document element |
на верхнем уровне больше одного тега | обернуть всё в один корневой тег |
Opening and ending tag mismatch / mismatched tag |
тег не закрыт или закрыт в другом регистре | сверить пары тегов, <Products> и <products> считаются разными тегами |
Input is not proper UTF-8 / not well-formed (invalid token) |
файл сохранён в Windows-1251, а в декларации написано UTF-8 | пересохранить файл в UTF-8 |
xmlParseEntityRef: no name |
голый символ & в тексте | заменить на & |
AttValue: " or ' expected |
значение атрибута без кавычек | взять значение в кавычки |
Ещё одна ловушка без всякого сообщения: файл называется products.xml.txt, а Проводник прячет второе расширение. Включите показ расширений в Проводнике и переименуйте файл.
Если XML нужен для обмена с сервисом, спросите, нет ли у него JSON: этот формат короче и проще в коде. Чем они различаются, мы разобрали в статье «Что такое JSON».
Где освоить XML и работу с данными
Один файл собрать несложно. Дальше начинаются схемы XSD, разбор чужих выгрузок, обмен с API и автоматизация на Python. Всё это входит в курсы, где разбирают XML, и в программы по веб-разработке. Их можно сравнить по цене, длительности и формату в нашем каталоге:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Fullstack-разработчик на PHP» Перейти на сайт курса | 166 715 ₽ | 5378 ₽/мес. | 12 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 145 100 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| Профессия «Веб-разработчик с нуля» Перейти на сайт курса | 127 300 ₽ | 7125 ₽/мес. | 13 месяцев | Обзор курса | |
| Профессия «Fullstack-разработчик» Перейти на сайт курса | 149 738 ₽ | 4404 ₽/мес. | 10 месяцев | Обзор курса | |
| Веб-разработчик Перейти на сайт курса | 141 036 ₽ | 5877 ₽/мес. | 6 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по веб-разработке




