Что такое XML?

Если вкратце

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>
Исходный код (github)
Прядко Максим
comments powered by Disqus