KursHub — каталог онлайн-курсов
Акции и промокодыОтзывы о школах

Что такое XML и зачем он нужен

#Блог

В мире цифровых технологий существует множество форматов для хранения и передачи данных, но XML (eXtensible Markup Language) занимает особое место благодаря своей универсальности и гибкости. Этот расширяемый язык разметки, вопреки распространенному заблуждению, не является языком программирования — он создан специально для структурирования информации логическим, понятным как для человека, так и для машины способом.

Почему же стоит изучать XML в эпоху JSON и YAML? Дело в том, что огромное количество существующих систем и форматов (от Microsoft Office до SVG-графики) построены на его основе. ХМЛ остается фундаментальным форматом для конфигурационных файлов многих приложений, веб-сервисов на базе SOAP, а также для обмена данными между несовместимыми платформами. Понимание XML открывает доступ к более глубокому пониманию архитектуры современных информационных систем и расширяет инструментарий для работы с данными.

Основы XML

Как устроен XML-документ

Архитектура ХМЛ-документа напоминает классическую древовидную структуру, где от корневого элемента расходятся ветви разной степени вложенности. Подобная организация позволяет создавать сложные информационные модели, сохраняя при этом логическую связность и читаемость.

Любой XML-документ начинается с пролога — декларации, сообщающей программам-обработчикам, что перед ними именно ХМЛ, а также указывающей версию формата и используемую кодировку:

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

Эта строка не является обязательной, но её присутствие считается хорошей практикой, особенно при работе с интернациональными данными.

Ключевая особенность ХМЛ — обязательное наличие единственного корневого элемента, который содержит все остальные данные. Это своеобразный "контейнер", обеспечивающий целостность структуры:

<library>

  <!-- Здесь размещаются все остальные элементы -->

</library>

Внутри корневого элемента располагаются вложенные элементы (теги), которые могут содержать как текстовые данные, так и другие элементы. Каждый элемент может иметь атрибуты — дополнительные характеристики, размещаемые в открывающем теге:

<book id="123" genre="фантастика" year="2023">

  <title>Нейроинтерфейсы будущего</title>

  <author>

      <firstname>Алексей</firstname>

      <lastname>Петров</lastname>

  </author>

  <price currency="RUB">750</price>

</book>

В этом примере элемент book имеет три атрибута: id, genre и year. Внутри него вложены элементы title, author (который, в свою очередь, содержит firstname и lastname) и price с атрибутом currency. Такая структура позволяет не только хранить данные, но и определять их семантические взаимосвязи, что делает XML мощным инструментом для моделирования сложных информационных объектов.

Продолжаю следующим подразделом об основных правилах синтаксиса ХМЛ.

Основные правила синтаксиса

В отличие от более свободного HTML, XML требует строгого соблюдения синтаксических правил. Эта строгость не случайна — она обеспечивает однозначность интерпретации данных и надежность при автоматической обработке. Несоблюдение любого из базовых правил делает документ невалидным и, как следствие, непригодным для использования в большинстве систем.

Рассмотрим ключевые правила, определяющие корректность ХМЛ-документа:

  • Наличие единственного корневого элемента. Все содержимое документа должно быть заключено в один единственный корневой тег.
  • Обязательное закрытие тегов. Каждый открытый тег должен быть закрыт — либо с помощью закрывающего тега (<element></element>), либо в формате самозакрывающегося тега (<element/>).
  • Строгая вложенность. Элементы должны быть правильно вложены — закрывающий тег вложенного элемента должен предшествовать закрывающему тегу родительского элемента.
  • Регистрозависимость. Теги в XML чувствительны к регистру, поэтому <Element> и <element> рассматриваются как разные элементы.
  • Заключение значений атрибутов в кавычки. Все значения атрибутов должны быть обрамлены кавычками (одинарными или двойными).

Пример корректного ХМЛ:

<company>

<department id="dev-01">

<name>Разработка</name>

<employees count="42">

<employee position="senior">

<firstname>Мария</firstname>

<lastname>Иванова</lastname>

</employee>

</employees>

</department>

</company>

Пример некорректного XML с типичными ошибками:

<company>

<Department id=dev-01>

<name>Разработка

<Employees count="42">

<employee position='senior'>

<firstname>Мария</firstname>

</employee>

</Employees>

</department>

<department id="hr-01">

<name>HR</name>

</department>

</Company>

В этом некорректном примере допущены следующие ошибки: несовпадение регистра в тегах company/Company и Department/department, отсутствие закрывающего тега , пропущены кавычки в атрибуте id, а также нарушена вложенность тегов и .

Схемы валидации XML: DTD и XSD

XML-документы, особенно в корпоративных и межсистемных интеграциях, должны строго соответствовать определённой структуре. Для проверки этой структуры применяют схемы валидации — специальные файлы, описывающие, какие элементы и атрибуты допустимы, в каком порядке они должны идти и какие значения могут принимать.

Существует два основных способа описания схемы XML-документа:

DTD (Document Type Definition)

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

  1. Не поддерживает описание типов данных (например, нельзя указать, что атрибут должен быть числом).
  2. Не работает с пространствами имён.
  3. Поддерживается практически всеми XML-парсерами.

Пример DTD:

<!DOCTYPE library [

<!ELEMENT library (book+)>

<!ELEMENT book (title, author, price)>

<!ELEMENT title (#PCDATA)>

<!ELEMENT author (#PCDATA)>

<!ELEMENT price (#PCDATA)>

]>

Этот DTD определяет, что в документе library может быть один или несколько элементов book, каждый из которых должен содержать title, author и price.

XSD (XML Schema Definition)

XSD — это более современный и мощный способ описания структуры XML. В отличие от DTD:

  1. Поддерживает типизацию данных (строка, число, дата и т.д.).
  2. Позволяет указывать ограничения (например, диапазоны чисел, минимальную длину строки).
  3. Поддерживает пространства имён.
  4. Используется в большинстве промышленных решений.

Пример XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="library">

<xs:complexType>

<xs:sequence>

<xs:element name="book" maxOccurs="unbounded">

<xs:complexType>

<xs:sequence>

<xs:element name="title" type="xs:string"/>

<xs:element name="author" type="xs:string"/>

<xs:element name="price" type="xs:decimal"/>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

Этот XSD-файл описывает аналогичную структуру, но с типами данных и возможностью проверки значений.

Как происходит валидация?

Чтобы проверить XML-документ на соответствие схеме, его нужно связать со схемой с помощью специальной ссылки в прологе или командой в парсере. Например:

DTD:

<?xml version="1.0"?>

<!DOCTYPE library SYSTEM "library.dtd">

XSD:

<library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="library.xsd">

Использование схем гарантирует, что структура XML-документа будет соответствовать ожидаемому стандарту, что особенно важно при обмене данными между разными системами.

Пространства имён (namespaces)

При работе со сложными информационными системами нередко возникает ситуация, когда в одном ХМЛ-документе необходимо использовать элементы из разных контекстов или предметных областей. Здесь мы сталкиваемся с проблемой: как избежать конфликтов между одинаково названными элементами, имеющими разное значение?

Для решения этой задачи в XML предусмотрен механизм пространств имён (namespaces), позволяющий четко идентифицировать происхождение и семантику каждого элемента. Концептуально это похоже на организацию файлов в разных папках на компьютере — даже если два файла имеют одинаковое имя, они могут сосуществовать, если находятся в разных директориях.

Рассмотрим конкретный пример: предположим, у нас есть система, обрабатывающая как обращения клиентов, так и жалобы. И в обоих случаях используется элемент <claim>, но его структура и назначение различаются:

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

<root>

<claim>

<from>ООО Ромашка</from>

<title>Справка</title>

<body>Прошу предоставить справку...</body>

</claim>

<claim>

<text>Прислали некачественный товар</text>

<author>client@example.com</author>

</claim>

</root>

Для обработчика такой документ становится проблемным: как определить, какой из элементов <claim> относится к обращениям, а какой — к жалобам? Здесь на помощь приходят пространства имён:

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

<root xmlns:req="http://www.example.org/request"

xmlns:cmpl="http://www.example.org/complaint">

<req:claim>

<from>ООО Ромашка</from>

<title>Справка</title>

<body>Прошу предоставить справку...</body>

</req:claim>

<cmpl:claim>

<text>Прислали некачественный товар</text>

<author>client@example.com</author>

</cmpl:claim>

</root>

Теперь элементы однозначно идентифицированы: req:claim относится к запросам, а cmpl:claim — к жалобам, что позволяет системе корректно обрабатывать каждый тип данных.

Преимущества и недостатки

При выборе формата для представления данных важно понимать сильные и слабые стороны каждого из них. ХМЛ, несмотря на свой почтенный возраст (стандарт был принят в 1998 году), остаётся востребованным форматом благодаря ряду существенных преимуществ, хотя и не лишен недостатков.

ПреимуществаНедостатки
Читаемость – XML-документы легко читаются человеком благодаря явной структуре и осмысленным именам теговИзбыточность – обязательные закрывающие теги и строгий синтаксис делают документы значительно объемнее их JSON-аналогов
Расширяемость – возможность создавать собственные теги и атрибуты позволяет моделировать данные практически любой сложностиСложность парсинга – обработка ХМЛ требует более сложных парсеров, чем, например, обработка JSON
Строгая структурированность – формальные правила синтаксиса гарантируют однозначность интерпретацииПроизводительность – обработка XML обычно требует больше вычислительных ресурсов из-за синтаксического анализа и валидации
Независимость от платформы – ХМЛ поддерживается практически всеми современными языками программирования и операционными системамиВысокий порог входа – для эффективной работы с XML часто требуется изучение дополнительных технологий (XPath, XSLT, XSD)
Поддержка пространств имён – возможность разрешать конфликты именования при интеграции данных из разных источниковВербозность – необходимость явно описывать структуру усложняет ручное создание и редактирование
Встроенные механизмы валидации – возможность определения формальных схем (DTD, XSD) для проверки корректности документовНеэффективность для простых данных – для несложных структур XML создает избыточную нагрузку
Трансформируемость – богатый инструментарий для преобразования в другие форматы (XSLT)Сложность работы с массивами – представление однородных коллекций в ХМЛ менее естественно, чем в JSON

Эти особенности необходимо учитывать при выборе формата данных для конкретного проекта. ХМЛ идеально подходит для сложных иерархических структур, особенно когда важны самодокументируемость и возможность валидации, но может оказаться избыточным для простых задач обмена данными, где лучше проявит себя более лаконичный JSON.

balans-plyusov-i-minusov-xml
Наглядное сравнение сильных и слабых сторон XML по основным характеристикам.

Где используется XML

Несмотря на растущую популярность более компактных форматов, ХМЛ остается фундаментальной технологией в многочисленных областях IT-индустрии. Его универсальность и надежность обеспечивают широкий спектр применений — от передачи данных между системами до хранения конфигураций и структурирования документов.

Веб-разработка и API

В области веб-сервисов ХМЛ традиционно занимает прочные позиции:

ТехнологияПрименениеПример
SOAPПротокол обмена структурированными сообщениями в распределенных вычислительных системах<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetStockPrice><StockName>GOOG</StockName></GetStockPrice></soap:Body></soap:Envelope>
REST APIПередача данных между клиентом и сервером (хотя сегодня чаще используется JSON)<response><status>success</status><data><user id="123"><name>John Doe</name></user></data></response>
RSS/AtomФорматы синдикации контента, используемые для новостных лент и подкастов<rss version="2.0"><channel><title>Новости технологий</title><item><title>Новая версия XML</title></item></channel></rss>

Конфигурационные файлы

ХМЛ широко используется для хранения настроек приложений и фреймворков:

СистемаПрименениеОсобенности
Spring FrameworkКонфигурация DI-контейнера и компонентовОпределение бинов, зависимостей, аспектов
Apache TomcatНастройка сервера приложенийКонфигурация виртуальных хостов, сервлетов, безопасности
AndroidОписание пользовательского интерфейса и манифеста приложенияСтруктура экранов, разрешения, компоненты
Maven/GradleУправление зависимостями и сборкой проектовОпределение зависимостей, плагинов, репозиториев

Документы и офисные форматы

Многие современные форматы документов представляют собой ZIP-архивы с XML-файлами внутри:

ФорматПрименениеСтруктура
DOCX/XLSX/PPTXФорматы Microsoft Office с 2007 годаСодержимое, стили, метаданные, связи между частями документа
ODT/ODS/ODPФорматы OpenDocument для текстов, таблиц и презентацийАналогично MS Office, но с открытой спецификацией
EPUBЭлектронные книгиМетаданные, содержимое, навигация, стили

SVG и векторная графика

ХМЛ лежит в основе формата SVG (Scalable Vector Graphics), который используется для описания двумерной векторной графики:

<svg width="100" height="100">

<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />

</svg>

Машинное обучение и разметка текста

ХМЛ находит применение и в современных технологиях:

ОбластьПрименениеПример использования
NLPСтруктурированная разметка текстов для обучения моделейВыделение сущностей, семантическая разметка, аннотирование
AIMLЯзык разметки для создания чат-ботовОпределение шаблонов диалогов и ответов
Корпусная лингвистикаХранение и описание лингвистических корпусовМорфологическая, синтаксическая, семантическая разметка

Такая широта применения подтверждает, что XML, несмотря на конкуренцию со стороны более современных форматов, продолжает оставаться важным инструментом в технологическом стеке современной IT-индустрии.

Примеры документов

Для лучшего понимания практического применения XML рассмотрим несколько реалистичных примеров, демонстрирующих, как этот формат может использоваться в различных сценариях.

Конфигурация подключения к базе данных

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

<database-configuration>

<connection id="primary">

<driver>org.postgresql.Driver</driver>

<url>jdbc:postgresql://db.example.com:5432/production</url>

<credentials>

<username>app_user</username>

<password encrypted="true">AQICEj+ExmTpPHMBAAAA</password>

</credentials>

<pool>

<min-connections>5</min-connections>

<max-connections>100</max-connections>

<timeout>30000</timeout>

</pool>

</connection>

<connection id="replica" read-only="true">

<driver>org.postgresql.Driver</driver>

<url>jdbc:postgresql://replica.example.com:5432/production</url>

<credentials>

<username>read_user</username>

<password encrypted="true">BgHrTyU+WzqL1PmBAAAA</password>

</credentials>

</connection>

</database-configuration>

В этом примере мы видим конфигурацию с двумя подключениями к базе данных — основным и репликой для чтения. ХМЛ позволяет удобно группировать связанные параметры (учетные данные, настройки пула соединений) и указывать атрибуты, уточняющие характер использования каждого подключения.

Организационная структура компании

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

<organization name="ТехноСфера" founded="2010">

<department id="exec">

<name>Руководство</name>

<employee position="CEO">

<name>Александр Петров</name>

<email>petrov@techno.com</email>

<manages>dept-dev, dept-marketing, dept-hr</manages>

</employee>

</department>

<department id="dept-dev">

<name>Отдел разработки</name>

<employee position="CTO">

<name>Мария Иванова</name>

<email>ivanova@techno.com</email>

<manages>team-backend, team-frontend, team-mobile</manages>

</employee>

<team id="team-backend">

<name>Бэкенд-разработка</name>

<lead>Дмитрий Сидоров</lead>

<members>12</members>

<technologies>Java, Python, PostgreSQL</technologies>

</team>

<!-- Другие команды -->

</department>

<!-- Другие отделы -->

</organization>

Этот пример демонстрирует возможности XML для представления иерархических структур. Мы видим отделы, подразделения и сотрудников с установленными отношениями подчинения.

Каталог товаров для интернет-магазина

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

<catalog last-updated="2024-03-15T14:30:00">

<category id="laptops">

<name>Ноутбуки</name>

<description>Портативные компьютеры для работы и развлечений</description>

<product id="lp-1001" available="true">

<name>TechBook Pro X5</name>

<manufacturer>TechCorp</manufacturer>

<specifications>

<cpu>Intel Core i7-12700H</cpu>

<ram units="GB">16</ram>

<storage type="SSD" units="GB">512</storage>

<display size="15.6" units="inch">2560x1440 IPS</display>

</specifications>

<price currency="RUB">129990</price>

<discount percent="12">Весенняя распродажа</discount>

<images>

<image type="main">products/lp-1001/main.jpg</image>

<image type="angle">products/lp-1001/angle.jpg</image>

</images>

</product>

<!-- Другие товары -->

</category>

<!-- Другие категории -->

</catalog>

В данном примере ХМЛ используется для структурирования каталога товаров с множеством вложенных элементов и атрибутов, позволяющих точно описать характеристики продукции и указать дополнительную метаинформацию, такую как наличие скидок или пути к изображениям.

Эти примеры наглядно показывают, как XML может использоваться для моделирования разнородных данных с сохранением их логической структуры и взаимосвязей.

XML против HTML и JSON

При выборе формата для работы с данными важно понимать фундаментальные различия между существующими альтернативами. ХМЛ часто сравнивают с HTML и JSON — форматами, которые на первый взгляд могут показаться похожими, но имеют принципиально разное назначение и характеристики.

XML vs HTML

Несмотря на внешнее сходство синтаксиса (оба используют теги в угловых скобках), эти языки разметки имеют разные цели:

ХарактеристикаXMLHTML
НазначениеСтруктурирование и передача данныхОтображение веб-страниц в браузере
Набор теговРасширяемый (создается пользователем)Фиксированный (определен стандартом HTML)
Строгость синтаксисаОчень строгий (обязательное закрытие тегов, регистрозависимость)Менее строгий (особенно в старых версиях)
СемантикаСтруктура определяется пользователемПредопределенные теги с конкретным значением
ВложенностьТребует строгого соблюдения правил вложенностиДопускает некоторые нарушения (браузеры пытаются корректировать)
СамодостаточностьДанные и их структураРазделение контента (HTML), представления (CSS) и поведения (JavaScript)

XML vs JSON

JSON (JavaScript Object Notation) в последние годы стал доминирующим форматом для веб-API и обмена данными, потеснив XML. Сравним их ключевые характеристики:

ХарактеристикаXMLJSON
СинтаксисОснован на тегах и атрибутахОснован на парах "ключ-значение" и массивах
Объем данныхБольше из-за закрывающих теговБолее компактный, меньше избыточности
ЧитаемостьХорошая для сложных структур, но избыточнаяЛаконичная, интуитивно понятная для простых структур
Поддержка метаданныхСильная (через атрибуты и пространства имен)Ограниченная (только через соглашения об именах)
Поддержка типов данныхОграниченная, обычно все в виде строкПоддерживает числа, строки, булевы, массивы, объекты
ВалидацияВстроенная поддержка схем (XSD, DTD)Требует сторонних решений (JSON Schema)
ТрансформацияМощные встроенные инструменты (XSLT, XPath)Требует программного кода
Интеграция с JavaScriptТребует парсингаНативная поддержка (можно напрямую преобразовать в объекты)
dolya-xml-i-json-v-api
Распределение форматов обмена данными в современных API: XML уступает JSON, но остаётся в ходу

Чем редактировать и просматривать

Для эффективной работы с XML необходим соответствующий инструментарий, который упростит редактирование, валидацию и анализ документов. В этом разделе мы рассмотрим наиболее популярные и функциональные решения для работы с ХМЛ-форматом.

Текстовые редакторы и IDE

РедакторКлючевые возможности для XML
Visual Studio CodeПодсветка синтаксиса, автодополнение, проверка валидности, форматирование. Расширения: XML Tools, XML Language Support by Red Hat.
Notepad++Лёгкий редактор с подсветкой синтаксиса, автоотступами, сворачиванием кода и плагином XML Tools для валидации.
JetBrains IntelliJ IDEAИнтеллектуальное редактирование с контекстными подсказками, навигацией по структуре, рефакторингом и интеграцией с XSD-схемами.
XMLSpyПрофессиональный XML-редактор с режимами представления Grid, Text и Schema, инструментами трансформации и валидации.

Онлайн-инструменты

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

  • XML Formatter & Validator (xmlvalidation.com) — проверка валидности и форматирование с различными отступами.
  • CodeBeautify XML Viewer — визуализация структуры документа, преобразование в JSON.
  • FreeFormatter.com — комплексный инструмент для работы с XML, включая валидацию по схеме.

Библиотеки для разработчиков

При программной обработке ХМЛ неоценимую помощь оказывают библиотеки для популярных языков программирования:

  • Python: xml.etree.ElementTree (стандартная библиотека), lxml (высокопроизводительная альтернатива с поддержкой XPath).
  • Java: JAXB для привязки XML к Java-объектам, DOM и SAX парсеры в стандартном API.
  • JavaScript: DOMParser в браузере, xml2js для Node.js, fast-xml-parser для высокопроизводительного разбора.
  • C#: System.Xml.Linq (LINQ to XML) для элегантной работы с XML-документами.

При выборе инструмента стоит учитывать размер и сложность ХМЛ-документов, с которыми предстоит работать, а также необходимые функции — от простого просмотра до комплексной валидации по схемам и трансформации. Для профессиональной разработки оптимальным выбором будет специализированная IDE с поддержкой XML или мощный текстовый редактор с соответствующими расширениями.

Заключение

Мы рассмотрели ключевые аспекты XML: от синтаксических правил и пространств имён до практических примеров использования в различных сферах IT-индустрии. XML остается незаменимым в сценариях, где важны строгая иерархия, семантическая структура и возможность валидации по формальным схемам.

  • XML — это формат для структурирования данных, который используется для хранения, передачи и обмена информацией между системами.
  • Главная особенность XML — древовидная структура с чёткой иерархией элементов и атрибутов.
  • XML поддерживает валидацию с помощью схем (DTD, XSD), что позволяет контролировать структуру данных.
  • Несмотря на конкуренцию с JSON и YAML, XML остаётся актуален в корпоративных системах, банковских приложениях, SOAP-сервисах, конфигурационных файлах, офисных документах и электронной векторной графике (SVG).
  • Работа с XML требует строгого соблюдения синтаксиса, включая закрытие всех тегов и правильную вложенность.
  • Для обработки XML существуют готовые библиотеки и инструменты — как локальные (IDE, редакторы), так и онлайн-сервисы.
  • Выбор между XML и другими форматами зависит от задачи: XML лучше подходит для сложных иерархий, где важна самодокументируемость, а JSON — для простых структур и быстрой передачи данных.

Если вы только начинаете осваивать профессию разработчика или системного аналитика, рекомендуем обратить внимание на подборку курсов по веб-разработке. В курсах есть как теоретическая база, так и практические задания для закрепления навыков.

Читайте также
Координатор цифрового внедрения в малом бизнесе: кто связывает руководителей, подрядчиков и IT-команду

Координатор цифрового внедрения в малом бизнесе: кто связывает руководителей, подрядчиков и IT-команду

Координатор цифрового внедрения помогает превратить купленные CRM, 1С и другие сервисы в работающий контур. Разбираемся, за что он отвечает, как оценивает результат проекта и какие навыки нужны для входа в профессию.
Специалист по юнит-экономике для онлайн-бизнеса: какие курсы помогают считать прибыль, а не оборот

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

Курсы по юнит-экономике обещают научить считать прибыль, но какие программы действительно дают нужные навыки? Разбираемся, что должно входить в обучение, какие инструменты потребуются и как собрать первый проект для портфолио.
Специалист по локальному digital-маркетингу: кто продвигает клиники, салоны и сервисы в картах и поиске

Специалист по локальному digital-маркетингу: кто продвигает клиники, салоны и сервисы в картах и поиске

Специалист по локальному digital-маркетингу отвечает за то, увидят ли клинику, салон или сервис в картах и дойдет ли пользователь до записи. Какие задачи входят в эту работу, что нужно уметь новичку и как собрать первый кейс? Разбираем профессию на практических примерах.
Веб-разработчик
Академия Эдюсон
132 отзыва
от 9 917 ₽
Веб-разработчик с нуля до PRO
от 8 670 ₽
Веб-разработчик с нуля
Нетология
47 отзывов
от 5 041 ₽
Fullstack-разработчик на python (с нуля)
Академия Эдюсон
132 отзыва
от 13 230 ₽
Профессия Веб-разработчик
от 6 389 ₽
Скопировать
Категории курсов