Что такое XML?
- Если вкратце
- Где используется XML?
- Структура
- Конфликт имён и пространство имён
- XML vs. JSON vs. HTML
Если вкратце
XML (eXtensible Markup Language, то есть «Расширяемый Язык Разметки») — это язык разметки, который используется для хранения и передачи данных (обычно из API), но не для отображения данных.
XML может быть прочитан как человеком, так и компьютером по аналогии с JSON.
Где используется XML?
Много где, например:
-
Веб-сервисы: XML используется для передачи данных между веб-серверами и клиентскими приложениями. Например, SOAP (Simple Object Access Protocol) использует XML для кодирования запросов и ответов между веб-серверами и клиентами.
-
Базы данных: XML может использоваться для представления данных.
-
Конфигурационные файлы: файлы конфигурации веб-приложений могут быть написаны на XML.
-
Интернет-магазины: XML используется для передачи информации о заказах между интернет-магазинами и поставщиками. Например, информация о заказах может быть сохранена в формате XML и передана поставщику через веб-сервис.
-
Офисные приложения: XML может использоваться для представления данных в офисных приложениях, таких как Microsoft Excel и Microsoft Word. Документы Excel могут быть сохранены в формате XML.
-
RSS-ленты: XML используется для создания RSS-лент, которые используются для распространения новостей и другой информации на веб-сайтах.
Структура
XML-документ состоит из пролога, элементов, текста, атрибутов и комментариев. Подобно HTML, каждый элемент может содержать другие элементы внутри себя.
Пролог
Любой XML-документ обычно начинается с объявления XML-версии и кодировки UTF. Всё вместе это называется пролог:
<?xml version="1.0" encoding="UTF-8"?>
Здесь "1.0"
указывает на версию XML, а "UTF-8"
указывает на кодировку символов.
Элементы
Далее следует корневой элемент, который содержит все остальные элементы в документе. Корневой элемент должен быть заключен в угловые скобки и иметь открывающий и закрывающий тег:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<frontend></frontend>
<backend />
</root>
В коде выше root
является корневым элементом, а frontend
и backend
— остальными элементами.
Важно! Все тэги обязательно должны быть закрыты, даже одиночные. Иначе будут ошибки:
✅
<?xml version="1.0" encoding="UTF-8"?>
<frameworks>
<vue>Vue</vue>
</frameworks>
❌
<?xml version="1.0" encoding="UTF-8"?>
<frameworks>
<vue>Vue
</frameworks>
Текст
Каждый элемент может содержать текст, который находится между открывающим и закрывающим тегом:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<name>Иван</name>
</users>
Здесь name
— это элемент, а Иван
— это текст, содержащийся в элементе.
Атрибуты
Элементы также могут содержать атрибуты, которые определяют дополнительные характеристики элемента. Атрибуты указываются в открывающем теге элемента, у них есть свои имя и значение:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<user name="Иван" age="28" id="123"/>
</root>
Здесь user
— это элемент, а name
, age
и id
— атрибуты элемента.
Комментарии
Комментарии могут быть добавлены в XML-документ с помощью специальной конструкции <!-- комментарий -->
:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- Мой комментарий -->
</root>
Конфликт имён и пространство имён
В HTML все теги заранее предопределены: есть <h1>
для крупных заголовков, <br />
для переноса строки или <div>
для описания блочного элемента. В XML все теги мы определяем самостоятельно.
Допустим, мы хотим описать комнату и вещи, которые в ней находятся. В HTML есть специальный тег <table>
, который определяет таблицу, поэтому добавим общий список всех объектов в комнате. А затем отдельно добавим компьютерный стол и тоже назовём его <table>
.
И если в одном документе встретятся оба тега <table>
, у которых разное значение, то произойдёт конфликт имён:
<?xml version="1.0" encoding="UTF-8"?>
<room>
<table>
<tr>
<td>Мебель</td>
<td>Техника</td>
</tr>
</table>
<table>
<name>Компьютерный стол</name>
<material>ПВХ</material>
</table>
</room>
Чтобы избежать этого, используются пространства имён. Для каждой <table>
нужно добавить атрибут xmlns
с URI-ссылкой на документ с пространством имён.
Значение атрибута xmlns
не указывает на фактический ресурс в Интернете, а используется только для идентификации пространства имен в XML-документе. Поэтому, когда определяется значение xmlns
, важно использовать уникальный идентификатор, который не будет конфликтовать с другими идентификаторами в XML-документе.
Для HTML-таблицы это будет ссылка на w3
, а для XML-таблицы — несуществующая ссылка на абстрактный стол:
<?xml version="1.0" encoding="UTF-8"?>
<room>
<table xmlns="https://www.w3.org/TR/html51">
<tr>
<td>Мебель</td>
<td>Техника</td>
</tr>
</table>
<table xmlns="http://example.com/table">
<name>Компьютерный стол</name>
<material>ПВХ</material>
</table>
</room>
Чтобы всё обрабатывалось правильно, осталось добавить префиксы с двоеточием для каждой таблицы:
<?xml version="1.0" encoding="UTF-8"?>
<room>
<stuff:table xmlns:stuff="https://www.w3.org/TR/html51">
<stuff:tr>
<stuff:td>Мебель</stuff:td>
<stuff:td>Техника</stuff:td>
</stuff:tr>
</stuff:table>
<pcTable:table xmlns:pcTable="http://example.com/table">
<pcTable:name>Компьютерный стол</pcTable:name>
<pcTable:state>ПВХ</pcTable:state>
</pcTable:table>
</room>
А ещё можно определить xmlns
сразу в корне:
<?xml version="1.0" encoding="UTF-8"?>
<room xmlns:stuff="https://www.w3.org/TR/html51" xmlns:pcTable="http://example.com/table">
<!-- Код такой же, как выше, только без xmlns внутри -->
</room>
Теперь элементы <table>
относятся к разным пространствам имён и конфликта не произойдёт!
XML vs. JSON vs. HTML
В качестве вывода тезисно обозначим особенности XML, JSON и HTML, чтобы понять разницу:
XML
- Предназначен для хранения и передачи данных, а не для отображения
- Все теги создаются с нуля, нужно придумывать их самому
- Код XML легко понятен человеку
- XML — дополнение к HTML
- XML легко расширяемый, похожий на HTML
- В протоколе SOAP можно применять только XML
Пример кода:
<book>
<title>Код. Тайный язык информатики</title>
<author>Ч. Петцольд</author>
<published>1999</published>
</book>
JSON
- Код JSON также легко понятен человеку
- REST поддерживает как JSON, так и XML
- JSON поддерживает разные типы данных:
string
,number
,boolean
,array
,object
,null
- JSON не нужно парсить, в отличие от XML, когда мы пишем на JavaScript
- JSON «легче» и быстрее, чем XML
Пример кода:
{
"book": {
"title": "Код. Тайный язык информатики",
"author": "Ч. Петцольд",
"published": "1999"
}
}
HTML
- Язык разметки, который отображают браузеры
- Поддерживает гиперссылки
- Браузеры могут сами исправлять код, если в нём есть ошибки
- Есть предопределённые теги
- Нет чувствительности к регистру
Пример кода:
<div>
<h1>Код. Тайный язык информатики</h1>
<p>Ч. Петцольд</p>
<p>1999</p>
</div>