XML (eXtensible Markup Language) — это текстовый формат разметки для хранения и обмена структурированными данными. Расширяемый он потому, что набор тегов не задан заранее: имена элементов придумывает автор документа под свою задачу. XML 1.0 принят как рекомендация W3C в 1998 году и до сих пор живёт в конфигурациях, документах Office, SVG, RSS и обмене между системами. Ниже — разбор примера, правила корректного документа, схемы, сравнение с JSON и YAML и работа с XML в Python.
Содержание
Что такое XML-файл и чем его открыть
XML-файл — обычный текстовый файл, как правило с расширением .xml, внутри которого данные размечены тегами. Открыть его можно любым текстовым редактором (Блокнот, VS Code, Notepad++) или браузером — он покажет дерево документа и укажет на ошибку разметки. Программы читают XML парсером — библиотекой, превращающей текст в дерево объектов.
Кодировка объявляется в первой строке; если объявления нет, парсер считает документ UTF-8 (UTF-16 распознаётся по маркеру BOM). Русский текст стоит хранить в UTF-8 и объявлять это явно.
Пример XML-документа с разбором
<?xml version="1.0" encoding="UTF-8"?>
<!-- Каталог небольшой библиотеки -->
<library>
<book id="1" lang="ru">
<title>Основы XML</title>
<year>2026</year>
</book>
<book id="2" lang="en">
<title>XML in Practice</title>
<year>2024</year>
<note/>
</book>
</library>
| Часть | В примере | Что это |
|---|---|---|
| Пролог | <?xml version="1.0" encoding="UTF-8"?> |
Необязательная первая строка: версия и кодировка. Если есть — строго первая, без пробелов перед ней |
| Комментарий | <!-- Каталог ... --> |
Пояснение для человека, парсер его пропускает. Внутри нельзя писать -- и вкладывать комментарии |
| Корневой элемент | <library> |
Единственный элемент верхнего уровня, всё остальное вложено в него |
| Элемент | <book>, <title> |
Открывающий тег, содержимое, закрывающий тег. Элементы образуют дерево |
| Атрибут | id="1", lang="ru" |
Пара имя-значение в открывающем теге, значение всегда в кавычках |
| Текст | Основы XML, 2026 |
Содержимое элемента. Для XML это всегда строка: 2026 станет числом только в программе |
| Пустой элемент | <note/> |
Сокращение для <note></note> |
Правила корректного (well-formed) документа
Документ называют well-formed, если он соблюдает синтаксис XML. В отличие от браузера с HTML, XML-парсер ошибку не прощает, а останавливается:
| Ошибка | Почему | Как правильно |
|---|---|---|
<a/><b/> на верхнем уровне |
Корневой элемент ровно один | <root><a/><b/></root> |
<item>текст |
Каждый открытый тег закрывается | <item>текст</item> или <item/> |
<a><b></a></b> |
Элементы вкладываются целиком, не пересекаются | <a><b></b></a> |
<Title>...</title> |
Регистр значим: Title и title — разные имена |
<title>...</title> |
<book id=1> |
Значение атрибута всегда в кавычках | <book id="1"> |
<cond>a < b</cond>, Tom & Jerry |
< начинает тег, & начинает сущность |
a < b, Tom & Jerry |
Кроме < и & есть ещё >, " и '; обязательно экранировать в тексте только < и &.
Well-formed — только про синтаксис. Что в <year> должно стоять число, а id обязателен, XML сам не проверяет — для этого есть схема.
Элемент или атрибут: когда что
<book id="1"> и <book><id>1</id> одинаково корректны. Выбор — по признакам:
- Атрибут — короткое значение, которое описывает элемент, а не является его содержимым: идентификатор, язык, единица измерения. Атрибут не повторяется в теге и не содержит вложенной структуры.
- Элемент — значение может повторяться (несколько авторов), состоит из частей (адрес), длинное или усложнится в будущем.
Сомневаетесь — делайте элемент, его проще расширить. В форматах с готовой схемой (SVG, Android, sitemap) выбор уже сделан за вас.
Пространства имён
Одноимённые элементы из разных словарей в одном документе (<title> книги и <title> из SVG-иконки внутри) различают пространства имён: атрибут xmlns привязывает префикс к уникальному URI.
<catalog xmlns:svg="http://www.w3.org/2000/svg">
<title>Каталог</title>
<svg:svg width="10" height="10"><svg:title>Иконка</svg:title></svg:svg>
</catalog>
URI — просто идентификатор, парсер по нему в интернет не ходит. xmlns="..." без префикса задаёт пространство по умолчанию для элемента и потомков — так устроены SVG и sitemap.xml.
Схемы: DTD и XSD
Схема описывает, какие элементы и атрибуты допустимы, в каком порядке и какого типа. Документ, прошедший такую проверку, называют валидным — это ступень выше well-formed. Схема нужна там, где XML приходит извне: интеграции, госсистемы, форматы документов.
- DTD — механизм из самой спецификации XML 1.0: задаёт состав элементов, но почти не умеет типы данных. Встречается в старых форматах.
-
XSD (XML Schema) — рекомендация W3C, сам является XML-документом, поддерживает типы (
xs:integer,xs:date), ограничения и обязательность. Сегодня это основной вариант. Схема элементаbookиз примера:
Внутри book сначала строка title, затем целое year, атрибут id обязателен. Документ с <year>две тысячи</year> проверку не пройдёт, хотя синтаксически корректен.
XML, JSON и YAML: что выбрать
| Критерий | XML | JSON | YAML |
|---|---|---|---|
| Типы данных | Всё — строки, типы через схему | Число, строка, логическое, null | Как JSON, тип угадывается по записи |
| Комментарии | Есть | Нет | Есть |
| Проверка структуры | DTD, XSD | JSON Schema | JSON Schema |
| Объём текста | Самый большой | Компактный | Компактный, чувствителен к отступам |
| Разбор в Python | xml.etree (стандартная) |
json (стандартная) |
PyYAML (сторонняя) |
| Где типично | Android, Maven, .NET, SOAP, Office, SVG | Web-API | Docker Compose, Kubernetes, CI |
Критерий выбора: формат задан партнёром, инструментом или стандартом — используйте его. Выбираете сами: обмен между программами и API — JSON; конфигурации, которые правят руками, — YAML; XML — когда нужна строгая проверка по схеме, смешанный текст с разметкой или совместимость с XML-экосистемой.
Работа с XML в Python: ElementTree
Модуль xml.etree.ElementTree входит в стандартную библиотеку Python. Разберём документ из примера (строка data):
import xml.etree.ElementTree as ET
root = ET.fromstring(data) # из файла: ET.parse("library.xml").getroot()
for book in root.findall("book"):
print(book.get("id"), book.find("title").text, book.findtext("year"))
# 1 Основы XML 2026
# 2 XML in Practice 2024
get() читает атрибут, find() — первый вложенный элемент, findtext() — его текст. Год вернулся строкой '2024', а не числом: int() остаётся на вас.
findall() понимает подмножество XPath — языка выражений для навигации по дереву. Заголовки всех английских книг на любой глубине:
for title in root.findall(".//book[@lang='en']/title"):
print(title.text) # XML in Practice
Создать документ и сохранить:
root = ET.Element("library")
book = ET.SubElement(root, "book", id="3")
ET.SubElement(book, "title").text = "Новая книга"
tree = ET.ElementTree(root)
ET.indent(tree) # отступы, Python 3.9+
tree.write("library.xml", encoding="utf-8", xml_declaration=True)
# library.xml:
# <?xml version='1.0' encoding='utf-8'?>
# <library>
# <book id="3">
# <title>Новая книга</title>
# </book>
# </library>
Спецсимволы библиотека экранирует сама. Если у документа есть пространство имён по умолчанию, имена при разборе выглядят как {URI}имя: find("item") вернёт None, а find("{http://example.com/ns}item") — элемент.
Типовые ошибки
Незакрытый или перепутанный тег — «частичного» результата нет:
ET.fromstring("<a><b></a>")
# xml.etree.ElementTree.ParseError: mismatched tag: line 1, column 8
Исправление: "<a><b></b></a>".
Неэкранированный амперсанд — типично при склейке XML из строк вручную:
ET.fromstring("<a>Tom & Jerry</a>")
# xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 8
Исправление: "<a>Tom & Jerry</a>", а лучше строить дерево через Element/SubElement — экранирование сделает библиотека.
Разбор чужого XML без защиты. Через внешние сущности специально составленный документ может заставить парсер прочитать локальный файл или съесть всю память. XML от пользователей и внешних систем разбирайте пакетом defusedxml (pip install defusedxml): интерфейс тот же, defusedxml.ElementTree.fromstring(data), опасные конструкции отключены.
Выводы
- XML (eXtensible Markup Language) — это текстовый формат разметки для хранения и обмена структурированными данными, в котором имена тегов задаёт автор документа.
- XML-файл — обычный текстовый файл, как правило с расширением .xml; открыть его можно любым текстовым редактором или браузером, а программы читают его парсером.
- Документ состоит из необязательного пролога с версией и кодировкой, единственного корневого элемента, вложенных элементов с текстом, атрибутов в кавычках и комментариев; всё содержимое для XML — строки.
- Корректный (well-formed) документ имеет один корневой элемент, закрытые и не пересекающиеся теги, значения атрибутов в кавычках и экранированные
<и&; состав и типы данных проверяют схемы DTD и XSD. - JSON компактнее и подходит для API, YAML — для конфигураций, а XML выбирают, когда нужна строгая проверка по схеме, смешанный текст с разметкой или совместимость с XML-экосистемой (Android, Maven, .NET, SOAP, Office, SVG, sitemap).
- В Python XML разбирают стандартным модулем
xml.etree.ElementTree(fromstring,findall,find,get, подмножество XPath), а XML от пользователей и внешних систем — пакетом defusedxml с отключёнными опасными конструкциями.
Где XML используется сегодня
Для новых web-API обычно берут JSON, но XML остаётся там, где важны схемы, документы и совместимость:
- конфигурации и сборка: AndroidManifest.xml и разметка экранов в Android, pom.xml в Maven, .csproj и конфиги в .NET;
- обмен между системами: SOAP-сервисы (описание в WSDL), электронная отчётность и документооборот с госсистемами, обмен 1С с сайтами (CommerceML);
- ленты и графика: RSS и Atom, векторный SVG;
- документы: DOCX, XLSX и PPTX — zip-архивы с XML-файлами внутри;
- SEO: sitemap.xml — карта сайта для поисковых систем.
На практике XML встречается как часть задачи: разобрать ответ SOAP-сервиса, поправить манифест Android-приложения, собрать sitemap или выгрузку для 1С. Основ из этой статьи хватает, чтобы читать такие файлы и не ломать их; дальше всё зависит от языка и платформы — это уровень программ из каталога курсов по программированию Otus. Посмотреть, как преподаватели разбирают практические задачи, можно на бесплатных открытых уроках.
Смежные темы: HTML и его основные элементы, Кодирование символов и UTF.
FAQ
Чем XML отличается от HTML? HTML — фиксированный набор тегов для отображения страниц, браузер прощает в нём ошибки. В XML теги задаёт автор, а нарушение синтаксиса — ошибка разбора. XHTML — это HTML, записанный по правилам XML.
Как проверить XML-файл на ошибки без программирования? Открыть в браузере: при нарушении синтаксиса он покажет строку и позицию. Проверку по XSD делают онлайн-валидаторы и IDE с расширением для XML.
Что такое XSLT и нужно ли его учить? Язык преобразования XML в другой XML, HTML или текст по шаблонам. Нужен в узких задачах (отчёты, старые интеграции); для типовой работы достаточно парсера и XPath.



