Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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/falsexs: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-схема состоит из:
- Корневого элемента
<xs:schema> - Простых типов для базовых данных
- Сложных типов для структурированных данных
- Элементов с определением структуры
- Атрибутов для доп. информации
- Ограничений для валидации значений
- Групп для переиспользования
- Пространств имён для организации
- Аннотаций для документирования
Это позволяет точно описать, какой XML должен выглядеть, и валидировать реальные документы против этого описания.