XML

Время чтения: 6 мин

Кратко

Секция статьи "Кратко"

XML (Extensible Markup Language) — расширяемый язык разметки. По структуре напоминает HTML. XML отличается тем, что теги для разметки разработчик должен определять самостоятельно. Используется для передачи данных между приложениями по аналогии с JSON.

Как пишется

Секция статьи "Как пишется"

Корневой элемент

Секция статьи "Корневой элемент"

У XML-документа обязательно должен быть один корневой элемент, который будет родительским для остальных элементов. В примере ниже <root> является корневым элементом:

        
          
          <?xml version="1.0" encoding="UTF-8"?><root>  <tree>    <leaf>Тут лежит листик</leaf>    <leaf>Тут лежит листик</leaf>  </tree></root>
          <?xml version="1.0" encoding="UTF-8"?>
<root>
  <tree>
    <leaf>Тут лежит листик</leaf>
    <leaf>Тут лежит листик</leaf>
  </tree>
</root>

        
        
          
        
      

XML-пролог

Секция статьи "XML-пролог"

Строка с которой может начинаться любой XML-документ — это пролог, который обозначает, с какой версией документа мы работаем. Пролог содержит версию и кодировку, которая используется:

        
          
          <?xml version="1.0" encoding="UTF-8"?>
          <?xml version="1.0" encoding="UTF-8"?>

        
        
          
        
      

Пролог для XML не обязателен, но если вы решили его указать, то нужно сделать это в самом начале документа. Он должен быть первым.

Теги

Секция статьи "Теги"

Основное правило для написания XML-документа — всегда закрывайте теги. Даже одиночные!
Правильно закрытые теги:

        
          
          <?xml version="1.0" encoding="UTF-8"?><cat>Борись и не сдавайся!</cat><dog />
          <?xml version="1.0" encoding="UTF-8"?>
<cat>Борись и не сдавайся!</cat>
<dog />

        
        
          
        
      

Если не закрыть тег, вся сила утекает из кода, и обработка выдаст ошибку:

        
          
          <?xml version="1.0" encoding="UTF-8"?><cat>Энергия кота Бориса утекает от нас<dog>
          <?xml version="1.0" encoding="UTF-8"?>
<cat>Энергия кота Бориса утекает от нас
<dog>

        
        
          
        
      

Структура

Секция статьи "Структура"

Документ состоит из разных сущностей, которые состоят из символов. Символы делятся на символы разметки и символы данных. К символам разметки, они же символы структуры документа, относятся:

Теги

Секция статьи "Теги"

Теги обозначают границы элементов. Одни могут содержать в себе текст, другие — теги, атрибуты или их сочетание. Например, определим сущность <petstore> для магазина домашних любимцев. В нём у нас есть несколько видов животных — <pet>. Эти два тега содержат в себе дочерние элементы — тоже теги.

У каждого питомца мы определили его вид с помощью атрибута category. У нас есть категории: cat, dog, fish. Дополнительная информация о питомце содержится в тегах <name>, <year>, <price>:

        
          
          <?xml version="1.0" encoding="UTF-8"?><petstore>  <pet category="cat">    <name>Борис</name>    <year>2021</year>    <price>485.00</price>  </pet>  <pet category="dog">    <name>Плуто</name>    <year>2020</year>    <price>2999.99</price>  </pet>  <pet category="fish">    <name>Нэмо</name>    <year>2021</year>    <price>100.50</price>  </pet></petstore>
          <?xml version="1.0" encoding="UTF-8"?>
<petstore>
  <pet category="cat">
    <name>Борис</name>
    <year>2021</year>
    <price>485.00</price>
  </pet>
  <pet category="dog">
    <name>Плуто</name>
    <year>2020</year>
    <price>2999.99</price>
  </pet>
  <pet category="fish">
    <name>Нэмо</name>
    <year>2021</year>
    <price>100.50</price>
  </pet>
</petstore>

        
        
          
        
      

Элементы могут быть пустыми или самозакрывающимися, например:

        
          
          <?xml version="1.0" encoding="UTF-8"?><cat></cat><cat />
          <?xml version="1.0" encoding="UTF-8"?>
<cat></cat>
<cat />

        
        
          
        
      

Атрибуты

Секция статьи "Атрибуты"

Атрибуты хранят определённую информацию, которая относится к конкретному элементу. Значения атрибутов должны быть указаны в кавычках, одинарных и двойных:

        
          
          <pet category="cat" /><pet category='dog' /><pet category='dog "corgi"' />
          <pet category="cat" />
<pet category='dog' />
<pet category='dog "corgi"' />

        
        
          
        
      

Конфликты именования тегов

Секция статьи "Конфликты именования тегов"

Так как в XML мы сами определяем имена для тегов, то есть вероятность возникновения конфликта имён. Если мы определим таблицу в XML тегами из HTML, то возникнет конфликт. Первый XML-код содержит информацию таблицы HTML, второй — описание кота. Если эти два фрагмента кода были сложены вместе, то возник бы конфликт имён. Они оба определены тегом <table>, но у них разное содержание. XML не знает как подружить эти разные структуры.

        
          
          <root>  <table>    <tr>      <th>Заголовок 1</th>      <th>Заголовок 2</th>    </tr>    <tr>      <td>Элемент 1</td>      <td>Элемент 2</td>    </tr>  </table>  <table>    <cat>Кот</cat>    <name>Борис</name>  </table></root>
          <root>
  <table>
    <tr>
      <th>Заголовок 1</th>
      <th>Заголовок 2</th>
    </tr>
    <tr>
      <td>Элемент 1</td>
      <td>Элемент 2</td>
    </tr>
  </table>

  <table>
    <cat>Кот</cat>
    <name>Борис</name>
  </table>
</root>

        
        
          
        
      

Можно разрешить эту проблему, если определить пространство имён. Для двух этих таблиц нужно добавить атрибут xmlns с указанием урла на документ с пространством имён:

        
          
          <table xmlns="https://www.w3.org/TR/html51/" />
          <table xmlns="https://www.w3.org/TR/html51/" />

        
        
          
        
      

Пространство имён помогает сохранить уникальность наименований. Стоит отметить, что добавление пространства имён накладывает ограничение на теги и атрибуты. Если мы ссылаемся на пространство имён, то можно использовать только те элементы, которые определены в этом пространстве. Нельзя задавать ссылку на локальный документ и нельзя определять xmlns как пустую строку.

Определим два пространства имён с помощью xmlns для разных таблиц: classic и catName, чтобы из XML можно было корректно считать данные. Пространства определены в ссылках, поэтому наименование строгое и должно соответствовать определению.

После введения атрибута xmlns необходимо добавить тегам префиксы с двоеточием classic: и catName:, тогда код будет обрабатываться правильно и выглядеть так:

        
          
          <root><root>  <classic:table xmlns:classic="https://www.w3.org/TR/html51">    <classic:tr>      <classic:th>Заголовок 1</classic:th>      <classic:th>Заголовок 2</classic:th>    </classic:tr>    <classic:tr>      <classic:td>Элемент 1</classic:td>      <classic:td>Элемент 2</classic:td>    </classic:tr>  </classic:table>  <catName:table xmlns:catName="https://catNameStandart.com/table">    <catName:cat>Кот</catName:cat>    <catName:name>Борис</catName:name>  </catName:table></root>
          <root>

<root>
  <classic:table xmlns:classic="https://www.w3.org/TR/html51">
    <classic:tr>
      <classic:th>Заголовок 1</classic:th>
      <classic:th>Заголовок 2</classic:th>
    </classic:tr>
    <classic:tr>
      <classic:td>Элемент 1</classic:td>
      <classic:td>Элемент 2</classic:td>
    </classic:tr>
  </classic:table>

  <catName:table xmlns:catName="https://catNameStandart.com/table">
    <catName:cat>Кот</catName:cat>
    <catName:name>Борис</catName:name>
  </catName:table>
</root>

        
        
          
        
      

Можно перенести все объявления пространств имён в корневой элемент. В нашем случае это будет так:

        
          
          <root xmlns:classic="https://www.w3.org/TR/html51/" xmlns:catName="https://catNameStandart.com/table">  <!-- код с таблицами как в примере выше, но без атрибутов xmlns в тегах table --></root>
          <root xmlns:classic="https://www.w3.org/TR/html51/" xmlns:catName="https://catNameStandart.com/table">
  <!-- код с таблицами как в примере выше, но без атрибутов xmlns в тегах table -->
</root>

        
        
          
        
      

Важное замечание на примере SVG. Если отдать браузеру SVG-файл без атрибута xmlns, то он его не отобразит.

У каждого приложения может быть свой вариант обработки конфликтов: либо сообщение об ошибке, либо игнорирование данных, которые оно не может обработать. В любом случае это приведёт к проблемам, поэтому стоит внимательно следить за xmlns.

На практике

Секция статьи "На практике"

kognitivnayabuena

Секция статьи "kognitivnayabuena"

XML vs HTML vs JSON

Секция статьи "XML vs HTML vs JSON"

XML

Секция статьи "XML"
  • Хорошо структурированный формат легко читать и писать из программ.
  • Теги XML не определены заранее. Их необходимо определить самостоятельно.
  • XML был разработан для передачи данных из API, а не для отображения этих данных.
  • XML - это расширяемый язык разметки, похожий на HTML.
  • Код разметки XML легко понять человеку.

HTML

Секция статьи "HTML"
  • Это простой язык разметки, который выводится в браузерах со стилями по умолчанию.
  • Поддерживает переходы между документами с помощью гиперссылок
  • Достаточно обширный, чтобы обеспечить поддержку встраивания мультимедиа в документы. Для XML такой возможности нет.
  • В отличие от XML и JSON, браузеры при обработке прощают ошибки и чинят их стандартным образом.

JSON

Секция статьи "JSON"
  • Популярнее XML, поддерживается всеми современными бэкендами.
  • Есть типы данных.
  • Легко использовать в JavaScript, так как не нужен парсинг.
  • Легко создавать и управлять с помощью JavaScript.

Преимущества использования XML

Секция статьи "Преимущества использования XML"
  • Делает документы совместимыми между системами и приложениями. С помощью XML можно быстро обмениваться данными между разными платформами.
  • XML отделяет данные от HTML. Для этого можно хранить данные в XML файле и получать новые и динамические значения в HTML-файле.
  • XML упрощает процесс смены платформы. Так как XML является текстовым форматом данных, можно спокойно менять платформу без лишних заморочек.

Недостатки XML

Секция статьи "Недостатки XML"
  • XML часто необходимо парсить чтобы извлечь данные.
  • Нет встроенной поддержки типов данных.
  • Пространство имён сложно реализовывать и использовать.
  • Многословнее чем JSON. Придётся писать много открывающих и закрывающих тегов.

Пример

Секция статьи "Пример"

Если мы пишем сайт с фильмографией, то нам необходимо знать название, год производства, жанры и бюджет картины. Ниже представлен пример набора информации о фильме.

        
          
          <?xml version="1.0" encoding="UTF-8"?><film>  <name>Шрэк</name>  <description>    мультфильм, фэнтези, комедия, приключения, семейный  </description>  <creationYear>2001</creationYear>  <budget>60 000 000 $</budget></film>
          <?xml version="1.0" encoding="UTF-8"?>
<film>
  <name>Шрэк</name>
  <description>
    мультфильм, фэнтези, комедия, приключения, семейный
  </description>
  <creationYear>2001</creationYear>
  <budget>60 000 000 $</budget>
</film>