← Назад к вопросам

Из чего состоит XML-схема?

1.0 Junior🔥 151 комментариев
#Форматы данных и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

XML-схема: структура и компоненты

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

Зачем нужна XML-схема?

Представьте, что вы получили XML с данными заказа, но не знаете его структуру. Схема отвечает на вопросы:

  • Какие элементы обязательны?
  • Какие имеют тип "число", какие — "строка"?
  • Какой диапазон значений допустим?
  • Может ли быть несколько элементов с одним именем?
  • Какие атрибуты допустимы?

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

Основные компоненты XML-схемы

1. Корневой элемент <xs:schema>

Все определения схемы находятся внутри этого элемента:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://example.com/order"
           targetNamespace="http://example.com/order"
           elementFormDefault="qualified">
  <!-- Все определения здесь -->
</xs:schema>

Атрибуты:

  • xmlns:xs — пространство имён XML Schema (обязательный префикс)
  • targetNamespace — пространство имён для элементов этой схемы
  • elementFormDefault — должны ли элементы быть квалифицированы (иметь префикс namespace)

2. Простые типы данных <xs:simpleType>

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

Встроенные простые типы

<xs:element name="price" type="xs:decimal"/>
<xs:element name="quantity" type="xs:integer"/>
<xs:element name="description" type="xs:string"/>
<xs:element name="date" type="xs:date"/>
<xs:element name="email" type="xs:email"/>
<xs:element name="active" type="xs:boolean"/>

Популярные встроенные типы:

  • xs:string — текст
  • xs:integer — целое число
  • xs:decimal — десятичное число
  • xs:float, xs:double — числа с плавающей запятой
  • xs:boolean — true/false
  • xs:date — дата (YYYY-MM-DD)
  • xs:dateTime — дата и время
  • xs:time — время
  • xs:email — email адрес
  • xs:anyURI — URI/URL

Пользовательские простые типы с ограничениями

<!-- Тип для кода товара (только буквы и цифры, от 3 до 20 символов) -->
<xs:simpleType name="ProductCode">
  <xs:restriction base="xs:string">
    <xs:pattern value="[A-Z0-9]{3,20}"/>
  </xs:restriction>
</xs:simpleType>

<!-- Тип для цены (больше нуля, до 2 знаков после запятой) -->
<xs:simpleType name="Price">
  <xs:restriction base="xs:decimal">
    <xs:minInclusive value="0.01"/>
    <xs:maxInclusive value="999999.99"/>
    <xs:fractionDigits value="2"/>
  </xs:restriction>
</xs:simpleType>

<!-- Тип для статуса (только определённые значения) -->
<xs:simpleType name="OrderStatus">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pending"/>
    <xs:enumeration value="processing"/>
    <xs:enumeration value="shipped"/>
    <xs:enumeration value="delivered"/>
    <xs:enumeration value="cancelled"/>
  </xs:restriction>
</xs:simpleType>

3. Сложные типы <xs:complexType>

Определяют типы, которые содержат вложенные элементы и/или атрибуты.

Сложный тип с последовательностью элементов (sequence)

<!-- Элементы идут в определённом порядке -->
<xs:complexType name="Order">
  <xs:sequence>
    <xs:element name="orderID" type="xs:integer"/>
    <xs:element name="customerName" type="xs:string"/>
    <xs:element name="orderDate" type="xs:date"/>
    <xs:element name="items" type="OrderItems"/>
  </xs:sequence>
  <xs:attribute name="status" type="OrderStatus" use="required"/>
</xs:complexType>

Сложный тип с выбором (choice)

<!-- Может быть ТОЛЬКО ОДИН из элементов -->
<xs:complexType name="PaymentMethod">
  <xs:choice>
    <xs:element name="creditCard" type="CreditCardInfo"/>
    <xs:element name="bankTransfer" type="BankInfo"/>
    <xs:element name="paypal" type="PayPalInfo"/>
    <xs:element name="cash" type="xs:string"/>
  </xs:choice>
</xs:complexType>

Сложный тип с группой (all)

<!-- Элементы могут идти в любом порядке -->
<xs:complexType name="Address">
  <xs:all>
    <xs:element name="street" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="zipCode" type="xs:string"/>
    <xs:element name="country" type="xs:string"/>
  </xs:all>
</xs:complexType>

4. Элементы <xs:element>

Определяют элементы в XML документе.

<!-- Простой элемент -->
<xs:element name="email" type="xs:string"/>

<!-- Элемент с типом по умолчанию -->
<xs:element name="quantity" type="xs:integer" default="1"/>

<!-- Элемент с фиксированным значением -->
<xs:element name="version" type="xs:string" fixed="1.0"/>

<!-- Элемент, который может повторяться несколько раз -->
<xs:element name="item" type="OrderItem" maxOccurs="unbounded"/>

<!-- Элемент, который может не быть (опциональный) -->
<xs:element name="comment" type="xs:string" minOccurs="0"/>

<!-- Элемент, который должен быть ровно один раз -->
<xs:element name="id" type="xs:integer" minOccurs="1" maxOccurs="1"/>

Основные атрибуты:

  • name — имя элемента
  • type — тип данных
  • minOccurs — минимальное количество повторений (по умолчанию 1)
  • maxOccurs — максимальное количество повторений (unbounded = бесконечно)
  • default — значение по умолчанию
  • fixed — фиксированное значение
  • use — для атрибутов: required, optional, prohibited

5. Атрибуты <xs:attribute>

Определяют атрибуты элементов.

<xs:complexType name="Product">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="price" type="xs:decimal"/>
  </xs:sequence>
  <!-- Атрибуты -->
  <xs:attribute name="id" type="xs:string" use="required"/>
  <xs:attribute name="category" type="xs:string" use="optional"/>
  <xs:attribute name="inStock" type="xs:boolean" default="true"/>
</xs:complexType>

Значения use:

  • required — атрибут обязателен
  • optional — атрибут опциональный (по умолчанию)
  • prohibited — атрибут запрещён

6. Ограничения <xs:restriction>

Заложены в simpleType для ограничения значений.

<!-- Минимальная и максимальная длина строки -->
<xs:simpleType name="Username">
  <xs:restriction base="xs:string">
    <xs:minLength value="3"/>
    <xs:maxLength value="20"/>
    <xs:pattern value="[a-zA-Z0-9_]+"/>
  </xs:restriction>
</xs:simpleType>

<!-- Диапазон чисел -->
<xs:simpleType name="Age">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="150"/>
  </xs:restriction>
</xs:simpleType>

<!-- Список допустимых значений -->
<xs:simpleType name="Color">
  <xs:restriction base="xs:string">
    <xs:enumeration value="red"/>
    <xs:enumeration value="green"/>
    <xs:enumeration value="blue"/>
  </xs:restriction>
</xs:simpleType>

<!-- Регулярное выражение для шаблона -->
<xs:simpleType name="ZipCode">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{5}"/>
  </xs:restriction>
</xs:simpleType>

Типы ограничений:

  • minLength, maxLength — длина строки
  • minInclusive, maxInclusive — диапазон (включительно)
  • minExclusive, maxExclusive — диапазон (исключительно)
  • enumeration — список допустимых значений
  • pattern — регулярное выражение
  • fractionDigits — кол-во знаков после запятой
  • totalDigits — всего цифр в числе
  • whiteSpace — обработка пробелов

7. Группы элементов <xs:group>

Позволяют переиспользовать наборы элементов в разных местах.

<!-- Определение группы -->
<xs:group name="AddressGroup">
  <xs:sequence>
    <xs:element name="street" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="zipCode" type="xs:string"/>
  </xs:sequence>
</xs:group>

<!-- Использование группы -->
<xs:complexType name="Customer">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:group ref="AddressGroup"/>
    <xs:element name="phone" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

8. Группы атрибутов <xs:attributeGroup>

Похожи на группы элементов, но для атрибутов.

<!-- Определение группы атрибутов -->
<xs:attributeGroup name="AuditInfo">
  <xs:attribute name="createdBy" type="xs:string" use="required"/>
  <xs:attribute name="createdDate" type="xs:dateTime" use="required"/>
  <xs:attribute name="modifiedBy" type="xs:string"/>
  <xs:attribute name="modifiedDate" type="xs:dateTime"/>
</xs:attributeGroup>

<!-- Использование группы -->
<xs:complexType name="Document">
  <xs:sequence>
    <xs:element name="title" type="xs:string"/>
    <xs:element name="content" type="xs:string"/>
  </xs:sequence>
  <xs:attributeGroup ref="AuditInfo"/>
</xs:complexType>

9. Пространства имён <xs:import>, <xs:include>

Позволяют использовать элементы из других схем.

<!-- Импорт элементов из другой схемы с другим namespace -->
<xs:import namespace="http://example.com/address"
          schemaLocation="address.xsd"/>

<!-- Включение элементов из другого файла (без namespace) -->
<xs:include schemaLocation="common-types.xsd"/>

<!-- Использование импортированного элемента -->
<xs:element name="shippingAddress"
            type="tns:Address"/>

10. Аннотации <xs:annotation>

Документирование схемы.

<xs:element name="email" type="xs:string">
  <xs:annotation>
    <xs:documentation>Электронный адрес клиента. Должен быть уникален.</xs:documentation>
  </xs:annotation>
</xs:element>

<xs:simpleType name="Price">
  <xs:annotation>
    <xs:documentation>Цена товара в рублях. Может быть дробной до 2 знаков.</xs:documentation>
    <xs:appinfo>От 0.01 до 999999.99</xs:appinfo>
  </xs:annotation>
  <xs:restriction base="xs:decimal">...</xs:restriction>
</xs:simpleType>

Пример полной XML-схемы

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://example.com/order"
           elementFormDefault="qualified">

  <!-- Простые типы -->
  <xs:simpleType name="OrderStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pending"/>
      <xs:enumeration value="confirmed"/>
      <xs:enumeration value="shipped"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Сложные типы -->
  <xs:complexType name="LineItem">
    <xs:sequence>
      <xs:element name="productID" type="xs:string"/>
      <xs:element name="quantity" type="xs:integer"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Order">
    <xs:sequence>
      <xs:element name="orderID" type="xs:integer"/>
      <xs:element name="customerName" type="xs:string"/>
      <xs:element name="orderDate" type="xs:date"/>
      <xs:element name="item" type="LineItem" maxOccurs="unbounded"/>
      <xs:element name="total" type="xs:decimal"/>
    </xs:sequence>
    <xs:attribute name="status" type="OrderStatus" use="required"/>
  </xs:complexType>

  <!-- Корневой элемент -->
  <xs:element name="orders" type="OrderCollection"/>

  <xs:complexType name="OrderCollection">
    <xs:sequence>
      <xs:element name="order" type="Order" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Соответствующий XML-документ

<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns="http://example.com/order">
  <order status="confirmed">
    <orderID>12345</orderID>
    <customerName>Иван Петров</customerName>
    <orderDate>2024-03-15</orderDate>
    <item>
      <productID>PROD001</productID>
      <quantity>2</quantity>
      <price>1500.00</price>
    </item>
    <item>
      <productID>PROD002</productID>
      <quantity>1</quantity>
      <price>3000.00</price>
    </item>
    <total>5500.00</total>
  </order>
</orders>

Использование XML-схемы в коде

Python (с использованием lxml):

from lxml import etree

# Загрузить схему
schema_doc = etree.parse(order.xsd)
schema = etree.XMLSchema(schema_doc)

# Валидировать XML документ
xml_doc = etree.parse(order.xml)
if schema.validate(xml_doc):
    print("XML соответствует схеме")
else:
    print(f"Ошибки валидации: {schema.error_log}")

JavaScript:

// Валидация XML с помощью XSD в браузере
const xmlDoc = new XMLHttpRequest();
xmlDoc.load(order.xml);

const schemaDoc = new XMLHttpRequest();
schemaDoc.load(order.xsd);

// Большинство браузеров не поддерживают встроенную валидацию
// Нужна стороння библиотека

Заключение

XML-схема состоит из:

  1. Корневого элемента <xs:schema>
  2. Простых типов для базовых данных
  3. Сложных типов для структурированных данных
  4. Элементов с определением структуры
  5. Атрибутов для доп. информации
  6. Ограничений для валидации значений
  7. Групп для переиспользования
  8. Пространств имён для организации
  9. Аннотаций для документирования

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

Из чего состоит XML-схема? | PrepBro