Представьте себе универсальный «язык-связку», который позволяет сохранять, обмениваться и структурировать данные между системами и людьми — от наглядных рецептов до сложных технических спецификаций. Это не фантазия, а реальность: XML — мощный и гибкий язык разметки, который остаётся опорой для множества форматов и интеграций в вебе и корпоративных решениях.
Язык XML
XML (от англ. eXtensible Markup Language) — это «расширяемый язык разметки», разработанный и рекомендованный Консорциумом Всемирной паутины (W3C). Спецификация описывает синтаксис документов и предъявляет требования к обработчикам, которые читают и интерпретируют XML — от простых парсеров до полноценных процессоров. Главная идея XML — сочетание строгого формального синтаксиса и удобочитаемости для человека, что делает его пригодным и для машинной, и для ручной обработки.
Почему XML называют «расширяемым»
XML не навязывает фиксированный набор тегов: разработчик сам определяет разметку под нужды предметной области. Набор конкретных тегов и атрибутов, а также правила вложенности и допустимых связей образуют так называемое расширение — грамматику на базе XML (например, DTD, XML Schema или собственные словари тегов). Благодаря этому появились десятки специализированных форматов на базе XML: от конфигураций приложений до форматов обмена данными и диаграмм.
Физическая и логическая структуры документа
Спецификация разделяет представление документа на физическую и логическую структуру. Это помогает понять, как именно парсер «видит» документ и какие конструкты он обрабатывает.
Физическая структура
С физической точки зрения документ состоит из сущностей (entities) — именованных блоков, содержимое которых представляет собой последовательности символов. Самая верхняя сущность — документная сущность (корень). Составляющие сущности могут ссылаться друг на друга; все они имеют имена (за исключением некоторых специальных сущностей).
Логическая структура
Логическая структура описывает составные части документа: пролог, корневой элемент, элементы, объявления, инструкции обработки, ссылки на сущности и комментарии. Всё это организовано с помощью разметки и определяет семантику XML-документа.
Основные элементы логической структуры
- Пролог — необязательная часть, где могут располагаться XML-декларация, объявления типа документа и комментарии;
- Корневой элемент — обязательный для корректного документа; охватывает всё содержимое;
- Вложенные элементы — элементы могут содержать другие элементы, текст и комментарии;
- Атрибуты — пары «имя-значение», связанные с элементами.
Символы разметки
Разметка в XML всегда открывается символом < и закрывается символом >. Дополнительная роль принадлежит символу &, который вводит ссылку на сущность или специальную сущность для замены символов, недопустимых в тексте.
Решение проблемы неоднозначности разметки
Чтобы парсер не путал символы разметки с обычным текстом, <, > и & нельзя вставлять прямо в символьные данные или в значение атрибута: для этого используются предопределённые сущности. Аналогично, кавычки и апострофы внутри атрибутов заменяются на соответствующие сущности.
| Символ | Сущность-замена | Примечание |
|---|---|---|
| < | < | Открывающая угловая скобка |
| > | > | Закрывающая угловая скобка |
| & | & | Амперсанд — вводит сущности |
| ' | ' | Апостроф в значении атрибута |
| " | " | Кавычка в значении атрибута |
Числовые ссылки на символы
Для обозначения символов по их кодовым позициям используются числовые ссылки двух форм: десятичная &#D; и шестнадцатеричная &#xH;. Это полезно при необходимости вставить символы, не представимые напрямую в выбранной кодировке документа.
- å — десятичная форма для латинской буквы с диакритикой;
- å или å — та же буква в шестнадцатеричной записи;
- И — пример кода для кириллической буквы;
- 水 — шестнадцатеричный код китайского иероглифа «вода».
Имена
Имена элементов и атрибутов в XML должны начинаться с буквы или символа подчёркивания (_), далее допускаются буквы Unicode, цифры, дефисы, точки и подчёркивания. Благодаря поддержке Unicode имена могут содержать символы практически любого языка — это ключевой фактор интернационализации.
Пролог
Объявление XML
XML-декларация (обычно запись вида <?xml version="1.0" encoding="UTF-8"?>) указывает версию языка, используемую в документе, и может содержать информацию о кодировке и атрибут standalone. Хотя ранние версии XML допускали отсутствие декларации, современная практика и спецификация предполагают её наличие, особенно когда указана кодировка, отличная от по умолчанию.
Примеры текстового представления декларации (в документе отображаются как текст):
<?xml version="1.1" encoding="UTF-8"?>
<?xml version="1.0" encoding="windows-1251"?>
Атрибут standalone указывает, требуется ли доступ к внешним объявлениям при обработке:
- standalone="yes" — документ самодостаточен и не требует внешней DTD;
- standalone="no" — возможно использование внешних деклараций.
Объявление типа документа (DOCTYPE)
Инструкция !DOCTYPE позволяет связать документ с DTD — набором правил, описывающих какие элементы, атрибуты и сущности допустимы. Документ без DTD может быть корректным (well-formed), но считаться невалидным относительно конкретной DTD.
Пример корректного, но невалидного документа (как простой пример существования корневого элемента):
<?xml version="1.0"?>
<greeting>Hello, world!</greeting>
А затем — пример использования внешней DTD:
<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>Hello, world!</greeting>
А также пример с локальным объявлением разметки в DOCTYPE:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
<!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello, world!</greeting>
Спецификация определяет формальную грамматику пролога и DOCTYPE (в терминах Бэкуса-Наура), что делает определение строгим и пригодным для автоматической валидации. Эксперты и ресурсы вроде официальной спецификации W3C и документации на MDN рекомендуют использовать DTD или XML Schema там, где требуется проверка структурной корректности и семантики.
Инструкции обработки
Инструкции обработки (processing instructions, PI) служат для передачи специальных указаний приложению, обрабатывающему документ. Частый пример — связка с CSS- или XSLT-стилями:
<?xml-stylesheet type="text/css" href="my-style.css"?>
Комментарий
Комментарии в XML начинаются с последовательности <!-- и заканчиваются -->. Внутри комментария недопустима комбинация символов --. Комментарии не рассматриваются как символьные данные документа и не интерпретируются как разметка.
Пример: <!-- это комментарий -->
Корневой элемент
Элемент и его разметка
Элемент — базовый логический блок XML-документа. Каждый элемент определяется парой начального и конечного тега; имена в паре должны совпадать. Существуют также пустые элементы, которые задаются одним тегом со слэшем (<empty />).
Формы тегов:
- Начальный тег: <element1>
- Конечный тег: </element1>
- Тег пустого элемента: <empty_element1 />
Атрибуты могут присутствовать только в начальном теге или теге пустого элемента и задают дополнительные свойства в виде пар «имя-значение».
Пример практического использования XML — хранение рецепта в структурированном виде (в примере ниже теги представлены текстовым образом):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE recipe>
<recipe name="хлеб" preptime="5min" cooktime="180min">
<title>Простой хлеб</title>
<composition>
<ingredient amount="3" unit="стакан">Мука</ingredient>
<ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
<ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
</composition>
<instructions>
<step>Смешать все ингредиенты и тщательно замесить.</step>
<step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
<!-- <step>Почитать вчерашнюю газету.</step> -->
<step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
</instructions>
</recipe>
Секция CDATA
Если нужно включить фрагмент текста, в котором символы разметки должны трактоваться как обычные символы (например, примеры кода), используется секция CDATA. Она начинается с <![CDATA[ и заканчивается ]]>. Текст внутри CDATA обрабатывается как символьные данные без интерпретации <, > и &.
Корректный документ
Корректный (well-formed) документ соответствует общим правилам синтаксиса XML: правильно вложенные теги, совпадающие имена начального и конечного тегов, корректные сущности и так далее. Несоблюдение хотя бы одного правила делает документ некорректным и парсер не сможет корректно его распознать.
Пространства имён
Для устранения конфликтов при объединении XML-фрагментов из разных словарей используется механизм пространств имён (namespaces). Он позволяет различать одинаковые имена элементов и атрибутов, принадлежащие разным схемам или спецификациям. Большинство руководств по интеграции XML (включая материалы W3C и практические руководства, публикуемые экспертами по XML) подчёркивают необходимость использования пространств имён в крупных проектах и при межсистемном обмене.
Регламентация работы с документами: правила, языки, программные интерфейсы
Эта часть обобщает рекомендации по работе с XML-документами, многие из которых исходят из публикаций W3C и практических руководств по обработке XML. Речь идёт о выборе кодировок, использовании схем валидации, API для парсинга и трансформации (например, SAX, DOM, StAX, XSLT) и правилах безопасной обработки внешних сущностей.
Кодировка документов
Спецификация XML требует поддержки как минимум двух кодировок: UTF-8 и UTF-16. На практике большинство современных систем и сервисов предпочитают UTF-8 как стандарт для обмена данными, поскольку она экономична и совместима с ASCII. В XML-декларации рекомендуется явно указывать кодировку (<?xml encoding="UTF-8"?>), особенно если документ может обрабатываться разными инструментами или в разных локалях. Ресурсы по разработке и стандарты от крупных организаций подтверждают: явное указание кодировки снижает риск ошибок при парсинге.
| Критерий | Рекомендация | Комментарий |
|---|---|---|
| Стандартная кодировка | UTF-8 | Широко поддерживается, рекомендуется для веб-обмена |
| Обязательность декларации | Указывать при нестандартной кодировке | Если декларация отсутствует, версия считается 1.0 |
| Валидация структуры | DTD / XML Schema / RELAX NG | Выбирать по требованиям проекта |
XML — полезные советы и интересные факты
- Используйте UTF-8 по умолчанию — это облегчает обмен данными между платформами и предотвращает проблемы с кодировкой.
- CDATA полезна для вставки больших фрагментов кода, но не заменяет корректное экранирование сущностей в остальных местах.
- Проверяйте well-formed перед тем, как запускать валидацию против схемы — многие ошибки легче исправить на этапе синтаксического анализа.
- Избегайте внешних сущностей, если не контролируете источник данных — это снижает риск уязвимостей XXE (совет безопасности, который поддерживают эксперты по XML).
- Используйте пространства имён, когда объединяете фрагменты из разных спецификаций — так вы предотвратите конфликты имён и упростите интеграцию.
Часто задаваемые вопросы
Что такое XML и в чём его отличие от HTML?
XML — это язык разметки, предназначенный для описания структуры данных и их переносимости. HTML — специализированный язык для представления и форматирования веб-страниц. XML не определяет визуального представления и позволяет создавать собственные теги, тогда как HTML имеет фиксированный набор элементов и семантики.
Когда нужно использовать CDATA?
CDATA применяется для включения фрагментов текста, в которых символы <, > и & должны трактоваться как обычные символы, а не как разметка. Это удобно при вставке примеров кода или больших блоков текста, но следует избегать использования CDATA вместо корректного экранирования в обычных ситуациях.
Как обеспечить корректную обработку XML-документа?
Сначала убедитесь, что документ well-formed: правильно вложенные теги, совпадающие имена начальных и конечных тегов, корректные сущности. Затем при необходимости примените валидацию против DTD или XML Schema для проверки соответствия структурным требованиям.
Какие кодировки поддерживаются и какую выбрать?
Спецификация требует поддержки UTF-8 и UTF-16. На практике рекомендуется UTF-8 как основную кодировку для обмена и хранения XML-файлов; её стоит явно указывать в XML-декларации.
