diff --git a/data/posts/ru/2023-06-06-xml.md b/data/posts/ru/2023-06-06-xml.md new file mode 100644 index 00000000..4669a027 --- /dev/null +++ b/data/posts/ru/2023-06-06-xml.md @@ -0,0 +1,321 @@ +--- +title: Что такое XML? +description: Простыми словами про язык разметки XML +author: Прядко Максим +--- + +## Если вкратце + +XML (*e**X**tensible **M**arkup **L**anguage*, то есть *«Расширяемый Язык Разметки»*) — это язык разметки, который используется для хранения и передачи данных (обычно из [API](https://guides.hexlet.io/ru/http-api/)), но не для отображения данных. + +XML может быть прочитан как человеком, так и компьютером по аналогии с [JSON](https://tproger.ru/articles/chto-takoe-json-vvedenie/). + +## Где используется XML? + +Много где, например: + +- Веб-сервисы: XML используется для передачи данных между веб-серверами и клиентскими приложениями. Например, [SOAP](https://ru.wikipedia.org/wiki/SOAP) (*Simple Object Access Protocol*) использует XML для кодирования запросов и ответов между веб-серверами и клиентами. + +- Базы данных: XML может использоваться для представления данных. + +- Конфигурационные файлы: файлы конфигурации веб-приложений могут быть написаны на XML. + +- Интернет-магазины: XML используется для передачи информации о заказах между интернет-магазинами и поставщиками. Например, информация о заказах может быть сохранена в формате XML и передана поставщику через веб-сервис. + +- Офисные приложения: XML может использоваться для представления данных в офисных приложениях, таких как Microsoft Excel и Microsoft Word. Документы Excel могут быть сохранены в формате XML. + +- RSS-ленты: XML используется для создания [RSS-лент](https://ru.hexlet.io/programs/frontend/projects/11), которые используются для распространения новостей и другой информации на веб-сайтах. + +## Структура + +XML-документ состоит из **пролога**, **элементов**, **текста**, **атрибутов** и **комментариев**. Подобно HTML, каждый элемент может содержать другие элементы внутри себя. + +#### Пролог + +Любой XML-документ обычно начинается с объявления XML-версии и кодировки UTF. Всё вместе это называется **пролог**: + +```xml + +``` + +Здесь `"1.0"` указывает на версию XML, а `"UTF-8"` указывает на кодировку символов. + +#### Элементы + +Далее следует **корневой элемент**, который содержит все **остальные элементы** в документе. Корневой элемент должен быть заключен в угловые скобки и иметь *открывающий* и *закрывающий* тег: + +```xml + + + + + +``` +В коде выше `root` является корневым элементом, а `frontend` и `backend` — остальными элементами. + +**Важно!** Все тэги обязательно должны быть закрыты, даже одиночные. Иначе будут ошибки: + +```xml +✅ + + + + Vue + +``` +```xml +❌ + + + + Vue + +``` + +#### Текст + +Каждый элемент может содержать **текст**, который находится между открывающим и закрывающим тегом: + +```xml + + + Иван + +``` + +Здесь `name` — это элемент, а `Иван` — это текст, содержащийся в элементе. + +#### Атрибуты + +Элементы также могут содержать **атрибуты**, которые определяют дополнительные характеристики элемента. Атрибуты указываются в открывающем теге элемента, у них есть свои имя и значение: + +```xml + + + + +``` + +Здесь `user` — это элемент, а `name`, `age` и `id` — атрибуты элемента. + +#### Комментарии + +**Комментарии** могут быть добавлены в XML-документ с помощью специальной конструкции ``: + +```xml + + + + +``` + +## Конфликт имён и пространство имён + +В HTML все теги заранее предопределены: есть `

` для крупных заголовков, `
` для переноса строки или `
` для описания блочного элемента. В XML все теги мы определяем самостоятельно. + +Допустим, мы хотим описать комнату и вещи, которые в ней находятся. В HTML есть специальный тег ``, который определяет таблицу, поэтому добавим общий список всех объектов в комнате. А затем отдельно добавим компьютерный стол и тоже назовём его `
`. + +И если в одном документе встретятся оба тега `
`, у которых разное значение, то произойдёт **конфликт имён**: + +```xml + + +
+ + + + +
МебельТехника
+ + + Компьютерный стол + ПВХ +
+ +``` +Чтобы избежать этого, используются **пространства имён**. + +В XML-документе нужно сначала объявить пространство имен с помощью атрибута `xmlns`, который должен быть добавлен к корневому элементу. Значение атрибута `xmlns` указывает на [URI](https://ru.wikipedia.org/wiki/URI) (Uniform Resource Identifier), который идентифицирует пространство имен. + +URI может быть каким угодно, но обычно используется URL, указывающий на документ, где определяется пространство имен. + +Попробуем использовать пространства имён, чтобы разрешить конфликт имён: + +```xml + + + + + Стол + Кресло + + + + + Компьютерный стол + ПВХ + + +``` +Здесь мы объявляем два пространства имен с URI `http://example.com/furniture` и `http://example.com/tech`. + +Затем мы присваиваем каждому элементу свой уникальный идентификатор с помощью префикса пространства имен (`furniture:` и `tech:`). Теперь элементы `` в разных пространствах имен не конфликтуют между собой, и мы можем использовать одно и то же имя элемента в разных контекстах. + +## XSD-схема + +XSD означает ***X**ML **S**chema **D**efinition* (*Определение XML-схемы*), а если ещё проще — это описание XML-документа. + +Зачем это нужно? Представим, что у нас есть два разработчика: первый должен получить XML-документ, а второй должен отправить XML-документ. Первый разработчик составляет для второго XSD-схему, второй делает всё по ней и отправляет нам XML-документ. + +Если проверка на типы данных и их организацию не проходят, то документ считается невалидным. Если всё проходит, значит с XML можно работать дальше. Очень удобно! + +XSD определяет следующие типы данных: + +- Простые типы: целые числа, строки, булевы значения, даты и другие простые типы данных. +- Сложные типы: состоят из набора элементов, которые могут содержать другие элементы. + +Пример XSD-схемы для XML-документа, содержащего информацию о студентах: + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + +``` +В этой схеме определен элемент `students`, который содержит неограниченное количество элементов `student`. + +Каждый элемент **student** содержит элементы `name`, `age` и `address`. + +Элемент **address** содержит вложенные элементы `city` и `zip`. + +Также определены типы данных для каждого элемента, например, тип `xs:string` для элемента `name` и `xs:int` для элемента `age`, и так далее. + +Эта схема определяет структуру, которую должен иметь XML-документ, чтобы он соответствовал требованиям. Например, каждый элемент `student` должен содержать элементы `name`, `age` и `address`, а элемент `address` должен содержать вложенные элементы `city` и `zip`. + +А теперь посмотрим пример. Предположим, что у нас есть XML-документ, который описывает студентов: + +```xml + + + + Юрий + 20 +
+ Архангельск + 163000 +
+
+ + Дарья +
+ Санкт-Петербург + 187015 +
+
+ + Николай + 22 + +
+``` + +Всё ли в нём правильно? Нет, есть ошибки. Согласно схеме: + +- У ***первого*** студента должен быть элемент ``, а не `` +- У ***второго*** студента отсутствует `` +- У ***третьего*** студента полностью отсутствует `
` + +Теперь исправим всё недочёты: + + +```xml + + + + Юрий + 20 +
+ Архангельск + 163000 +
+
+ + Дарья + 19 +
+ Санкт-Петербург + 187015 +
+
+ + Николай + 22 +
+ Вологда + 160000 +
+
+
+``` + +Отлично! XML-документ прошёл валидацию и может быть обработан дальше. + + +## Вывод + +В качестве вывода тезисно обозначим особенности XML: + +- Предназначен для хранения и передачи данных, а не для отображения +- Все теги создаются с нуля, нужно придумывать их самому +- Код XML легко понятен человеку +- XML легко расширяемый, похожий на HTML +- В протоколе [SOAP](https://ru.wikipedia.org/wiki/SOAP) можно применять только XML +- XSD — это схема для определения XML-документа. Важно пользоваться ей, чтобы в XMl не было ошибок + +Пример XSD-схемы: + +```xml + + + + + + + + + + + + +``` + +Пример XML-документа: + +```xml + + Код. Тайный язык информатики + Ч. Петцольд + 1999 + +``` \ No newline at end of file