DevToys Pro

бесплатные веб-инструменты для разработчиков

Блог
Оцените нас:
Попробуйте расширение для браузера:
← Назад к блогу

XML корректный vs схемо-валидный: Что на самом деле проверяют валидаторы

12 мин чтения

Ваш XML парсер выдаёт ошибку, но вы не уверены, это проблема синтаксиса или схемной валидации. Понимание разницы между корректным XML и схемо-валидным XML критически важно для отладки обработки XML, интеграций API и конфигурационных файлов. Это руководство объясняет, что проверяет каждый тип валидации и как идентифицировать распространённые ошибки.

Корректный XML: Базовые правила синтаксиса

Корректный XML означает, что документ следует фундаментальным правилам синтаксиса XML. Любой XML парсер может это проверить без схемы.

Корректный XML документ должен:

  • Иметь единственный корневой элемент
  • Правильно вкладывать все элементы
  • Закрывать все теги
  • Заключать в кавычки все значения атрибутов
  • Использовать валидную кодировку символов
  • Экранировать специальные символы в текстовом контенте

Пример: Корректный XML

<?xml version="1.0" encoding="UTF-8"?>
<order>
  <customer id="12345">
    <name>John Doe</name>
    <email>john@example.com</email>
  </customer>
  <items>
    <item sku="ABC-001" quantity="2">Widget A</item>
    <item sku="XYZ-999" quantity="1">Widget B</item>
  </items>
  <total>49.99</total>
</order>

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

Пример: НЕ корректный XML

<?xml version="1.0" encoding="UTF-8"?>
<order>
  <customer id=12345>
    <name>John Doe
    <email>john@example.com</email>
  </customer>
  <items>
    <item sku="ABC-001" quantity="2">Widget A</item>
  </order>
</items>

Этот XML имеет множественные ошибки корректности:

  • id=12345 - значение атрибута не в кавычках (должно быть id="12345")
  • <name>John Doe - незакрытый тег (отсутствует </name>)
  • Неправильная вложенность - теги закрыты в неправильном порядке

Используйте XML валидатор, чтобы проверить, корректен ли ваш XML. Валидатор немедленно поймает эти синтаксические ошибки.

Схемо-валидный XML: Валидация бизнес-правил

Схемо-валидный XML означает, что документ следует правилам, определённым в XML схеме (XSD). Документ может быть корректным, но НЕ схемо-валидным.

Схемная валидация проверяет:

  • Структуру элементов - обязательные элементы, порядок элементов, допустимые дочерние элементы
  • Типы данных - целые числа, даты, перечисления, паттерны (регулярные выражения)
  • Кардинальность - мин/макс вхождения элементов
  • Атрибуты - обязательные атрибуты, допустимые значения
  • Пространства имён - правильные объявления и использование пространств имён
  • Ограничения - уникальность, ссылки на ключи

Пример: XSD схема

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="customer" type="customerType"/>
        <xs:element name="items" type="itemsType"/>
        <xs:element name="total" type="xs:decimal"/>
      </xs:sequence>
      <xs:attribute name="orderId" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="customerType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="email" type="emailType"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:positiveInteger" use="required"/>
  </xs:complexType>

  <xs:simpleType name="emailType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[^@]+@[^@]+\.[^@]+"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="itemsType">
    <xs:sequence>
      <xs:element name="item" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="sku" type="xs:string" use="required"/>
              <xs:attribute name="quantity" type="xs:positiveInteger" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Пример: Валидный по схеме

<?xml version="1.0" encoding="UTF-8"?>
<order orderId="ORD-2026-001">
  <customer id="12345">
    <name>John Doe</name>
    <email>john@example.com</email>
  </customer>
  <items>
    <item sku="ABC-001" quantity="2">Widget A</item>
    <item sku="XYZ-999" quantity="1">Widget B</item>
  </items>
  <total>49.99</total>
</order>

Этот XML и корректен, и схемо-валиден, потому что он соответствует правилам XSD:

  • Имеет обязательный атрибут: orderId на корневом элементе
  • Элементы в правильном порядке: customer, items, total
  • Email соответствует паттерну (имеет @ и .)
  • Все числовые поля являются положительными целыми или десятичными числами
  • Существует хотя бы один элемент item

Пример: НЕ валидный по схеме (но корректный)

<?xml version="1.0" encoding="UTF-8"?>
<order>
  <customer id="-500">
    <name>John Doe</name>
    <email>invalid-email</email>
  </customer>
  <items>
    <!-- Нет элементов! -->
  </items>
  <total>not-a-number</total>
</order>

Этот XML корректен (валидный синтаксис), но НЕ схемо-валиден, потому что:

  • Отсутствует обязательный атрибут: orderId на корневом элементе
  • Невалидный ID клиента: -500 не является положительным целым числом
  • Невалидный email: invalid-email не соответствует email паттерну
  • Нет элементов: minOccurs="1" требует хотя бы один item
  • Невалидная сумма: not-a-number не является десятичным числом

Используйте XML/XSD валидатор для валидации XML по XSD схеме. Этот серверный инструмент выполняет полную схемную валидацию с подробными сообщениями об ошибках.

Распространённые ошибки валидации

Ошибки корректности

Незакрытые теги

<!-- ОШИБКА: Отсутствует закрывающий тег -->
<customer>
  <name>John Doe
</customer>

<!-- ИСПРАВЛЕНИЕ: Закройте все теги -->
<customer>
  <name>John Doe</name>
</customer>

Атрибуты без кавычек

<!-- ОШИБКА: Значения атрибутов должны быть в кавычках -->
<item id=123 name=Widget>

<!-- ИСПРАВЛЕНИЕ: Заключите все значения атрибутов в кавычки -->
<item id="123" name="Widget">

Неправильная вложенность

<!-- ОШИБКА: Теги должны закрываться в обратном порядке -->
<outer>
  <inner>Content</outer>
</inner>

<!-- ИСПРАВЛЕНИЕ: Правильная вложенность -->
<outer>
  <inner>Content</inner>
</outer>

Специальные символы не экранированы

<!-- ОШИБКА: < и & должны быть экранированы -->
<description>Цена: 5 < 10 & условие истинно</description>

<!-- ИСПРАВЛЕНИЕ: Используйте ссылки на сущности -->
<description>Цена: 5 &lt; 10 &amp; условие истинно</description>

<!-- ИЛИ: Используйте секцию CDATA -->
<description><![CDATA[Цена: 5 < 10 & условие истинно]]></description>

Ошибки схемной валидации

Отсутствует обязательный элемент

<!-- XSD требует элемент email -->
<xs:element name="email" minOccurs="1"/>

<!-- ОШИБКА: Отсутствует обязательный элемент -->
<customer>
  <name>John Doe</name>
</customer>

<!-- ИСПРАВЛЕНИЕ: Включите обязательный элемент -->
<customer>
  <name>John Doe</name>
  <email>john@example.com</email>
</customer>

Неправильный тип данных

<!-- XSD ожидает целое число -->
<xs:element name="quantity" type="xs:integer"/>

<!-- ОШИБКА: Текст вместо числа -->
<quantity>пять</quantity>

<!-- ИСПРАВЛЕНИЕ: Используйте числовое значение -->
<quantity>5</quantity>

Элементы в неправильном порядке

<!-- XSD определяет последовательность: name, email, phone -->
<xs:sequence>
  <xs:element name="name"/>
  <xs:element name="email"/>
  <xs:element name="phone"/>
</xs:sequence>

<!-- ОШИБКА: Неправильный порядок -->
<customer>
  <email>john@example.com</email>
  <name>John Doe</name>
  <phone>555-0100</phone>
</customer>

<!-- ИСПРАВЛЕНИЕ: Следуйте порядку схемы -->
<customer>
  <name>John Doe</name>
  <email>john@example.com</email>
  <phone>555-0100</phone>
</customer>

Слишком много вхождений

<!-- XSD допускает максимум 1 email -->
<xs:element name="email" maxOccurs="1"/>

<!-- ОШИБКА: Несколько email -->
<customer>
  <name>John Doe</name>
  <email>john@work.com</email>
  <email>john@personal.com</email>
</customer>

<!-- ИСПРАВЛЕНИЕ: Только один email -->
<customer>
  <name>John Doe</name>
  <email>john@work.com</email>
</customer>

Невалидное значение атрибута

<!-- XSD ограничивает status перечислением -->
<xs:attribute name="status">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="pending"/>
      <xs:enumeration value="approved"/>
      <xs:enumeration value="rejected"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

<!-- ОШИБКА: Невалидное значение перечисления -->
<order status="processing">

<!-- ИСПРАВЛЕНИЕ: Используйте валидное значение перечисления -->
<order status="pending">

Валидация пространств имён

Пространства имён являются частью схемной валидации. Если ваш XSD определяет целевое пространство имён, ваш XML должен правильно использовать это пространство имён.

XSD с целевым пространством имён

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://example.com/order"
  xmlns:ord="http://example.com/order"
  elementFormDefault="qualified">
  
  <xs:element name="order">
    <!-- определение схемы -->
  </xs:element>
</xs:schema>

XML должен соответствовать пространству имён

<!-- ОШИБКА: Отсутствует пространство имён -->
<order>
  <customer id="123">
    <name>John Doe</name>
  </customer>
</order>

<!-- ИСПРАВЛЕНИЕ: Включите объявление пространства имён -->
<order xmlns="http://example.com/order">
  <customer id="123">
    <name>John Doe</name>
  </customer>
</order>

<!-- ИЛИ: Используйте префикс пространства имён -->
<ord:order xmlns:ord="http://example.com/order">
  <ord:customer id="123">
    <ord:name>John Doe</ord:name>
  </ord:customer>
</ord:order>

Распространённые ошибки пространств имён включают отсутствующие объявления пространств имён, неправильные URI пространств имён и неправильное использование префиксов. XML/XSD валидатор проверяет валидацию пространств имён как часть схемной валидации.

Процесс валидации: Что и когда проверять

Шаг 1: Сначала проверьте корректность

Всегда валидируйте корректность перед схемной валидацией. Если XML не корректен, схемная валидация провалится с запутанными ошибками.

# Быстрая проверка: Это валидный XML синтаксис?
# Используйте: инструмент XML валидатор

1. Вставьте XML в валидатор
2. Проверьте синтаксические ошибки
3. Исправьте все проблемы корректности
4. Только потом переходите к схемной валидации

Шаг 2: Валидируйте по схеме

Когда XML корректен, валидируйте по XSD схеме для проверки бизнес-правил и типов данных.

# Схемная валидация: XML соответствует правилам XSD?
# Используйте: XML/XSD валидатор (серверный)

1. Вставьте XML в валидатор
2. Вставьте XSD схему
3. Запустите валидацию
4. Исправьте нарушения схемы
5. Повторяйте валидацию до отсутствия ошибок

Шаг 3: Отладка ошибок валидации

Внимательно читайте сообщения об ошибках. Схемные валидаторы часто предоставляют номера строк и пути:

Ошибка на строке 5, столбец 10:
Элемент 'email': 'invalid-email' не является валидным значением атомарного типа 'emailType'.

Перевод:
- Строка 5: <email>invalid-email</email>
- Проблема: Значение не соответствует email паттерну в схеме
- Исправление: Используйте валидный формат email

Реальный пример: SOAP API запрос

SOAP API используют XML со строгими схемами. Вот реалистичный пример, показывающий разницу между корректным и валидным XML.

SOAP схема (упрощённая)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://api.example.com/payment"
           xmlns:pay="http://api.example.com/payment">
  
  <xs:element name="processPayment">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="amount" type="xs:decimal"/>
        <xs:element name="currency" type="currencyCode"/>
        <xs:element name="cardNumber" type="cardType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="currencyCode">
    <xs:restriction base="xs:string">
      <xs:enumeration value="USD"/>
      <xs:enumeration value="EUR"/>
      <xs:enumeration value="GBP"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="cardType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{16}"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Корректный, но НЕ валидный запрос

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <processPayment xmlns="http://api.example.com/payment">
      <amount>abc</amount>
      <currency>USD</currency>
      <cardNumber>1234</cardNumber>
    </processPayment>
  </soap:Body>
</soap:Envelope>

Этот запрос корректен (валидный XML синтаксис), но схемная валидация не проходит:

  • amount это "abc" - не десятичное число
  • cardNumber это "1234" - не соответствует 16-значному паттерну

Валидный запрос

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <processPayment xmlns="http://api.example.com/payment">
      <amount>99.99</amount>
      <currency>USD</currency>
      <cardNumber>4111111111111111</cardNumber>
    </processPayment>
  </soap:Body>
</soap:Envelope>

Теперь запрос и корректен, И схемо-валиден:

  • amount это валидное десятичное число
  • currency это валидное значение перечисления
  • cardNumber соответствует 16-значному паттерну
  • Элементы в правильном порядке
  • Пространства имён правильно объявлены

Краткая справка: Типы ошибок

Тип ошибкиУровень валидацииПример
Незакрытый тегКорректность<name>John (отсутствует </name>)
Атрибут без кавычекКорректностьid=123 (должно быть id="123")
Неправильная вложенностьКорректность<a><b></a></b>
Невалидные символыКорректностьНеэкранированные < или &
Отсутствует обязательный элементСхемная валидация<customer> без <email>
Неправильный тип данныхСхемная валидация<quantity>пять</quantity> (ожидается целое число)
Неправильный порядок элементовСхемная валидацияЭлементы не в последовательности, определённой XSD
Невалидное значение перечисленияСхемная валидацияstatus="invalid" (не в списке перечисления)
Несоответствие паттернуСхемная валидацияemail="not-an-email" (не соответствует regex)
Нарушение кардинальностиСхемная валидацияСлишком много или слишком мало вхождений
Неправильное пространство имёнСхемная валидацияОтсутствующий или неправильный URI пространства имён

Инструменты для XML валидации

DevToys Pro предоставляет два инструмента XML валидации:

  • XML валидатор - Клиентская проверка корректности. Быстрая, мгновенная обратная связь по синтаксическим ошибкам. Используйте для быстрых проверок структуры XML.
  • XML/XSD валидатор - Серверная схемная валидация. Валидирует XML по XSD схемам с подробными сообщениями об ошибках. Используйте для полной валидации, включая бизнес-правила, типы данных и пространства имён.

Лучшие практики

  • Валидируйте рано - Проверяйте корректность во время разработки, а не в production
  • Используйте схемы - Определяйте XSD схемы для API и конфигурационных файлов
  • Валидируйте с обеих сторон - Клиент валидирует перед отправкой, сервер валидирует при получении
  • Предоставляйте чёткие ошибки - Включайте номера строк и пути элементов в сообщения об ошибках
  • Тестируйте граничные случаи - Валидируйте с пустыми значениями, специальными символами, граничными условиями
  • Обновляйте схемы - Версионируйте XSD схемы вместе с версиями API

Резюме

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

Схемо-валидный XML следует бизнес-правилам, определённым в XSD схеме (обязательные элементы, типы данных, порядок, кардинальность, пространства имён). Требует валидирующий парсер со схемой.

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

Используйте XML валидатор для проверки синтаксиса и XML/XSD валидатор для полной схемной валидации.


Нужно валидировать XML для SOAP API или конфигурационных файлов? Попробуйте наш XML валидатор для быстрых проверок синтаксиса и XML/XSD валидатор для полной схемной валидации с подробной отчётностью об ошибках.