Обратная задача возникает, когда REST-сервису нужен XML-канал: обмен файлами с партнёром, госсистема, старая шина. Схему можно не переписывать вручную.
Как преобразовать
- Откройте схему в редакторе JSON Schema.
- Выберите Файл → Преобразовать в → XSD.
- Проверьте замечания и сохраните результат или откройте его в песочнице XSD — там схема сразу проверится и покажется диаграммой.

Как переносятся конструкции
- Корневой элемент — по
titleсхемы (или по названию файла). $defsиdefinitions— именованныеxs:complexTypeиxs:simpleType;$ref— ссылки на них.- Свойства — элементы
xs:sequence; не входящие вrequired—minOccurs="0". - Массивы — повторяющийся элемент:
maxOccursизmaxItemsилиunbounded. enum,minLength,maxLength,pattern,minimum,maximum— фасетыxs:restriction;format— встроенный тип (date→xs:date).allOfс$ref— наследование черезxs:extension;oneOf/anyOf—xs:choice.- Тип с
null— элемент сnillable="true". - Свойства
@имя— атрибуты,#text— текст элемента.
Что не выражается в XSD
Условные конструкции (if/then/else, not), patternProperties, dependentRequired в XML Schema 1.0 не выражаются и пропускаются — окно предупредит. Шаблон без ^…$ оборачивается в .*(…).*, потому что XSD сравнивает значение целиком.
Ссылки на другие файлы
Если схема ссылается на определения в других файлах ("$ref": "common.json#/$defs/Money") и хранится в проекте, эти определения найдутся по папкам и станут типами в той же XSD.
Пример
{
"title": "order",
"type": "object",
"required": ["id"],
"properties": {
"id": {"type": "integer"},
"tags": {"type": "array", "items": {"type": "string", "enum": ["a", "b"]}}
}
}
превращается в
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:integer"/>
<xs:element name="tags" minOccurs="0" maxOccurs="unbounded">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="a"/>
<xs:enumeration value="b"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Вопросы и ответы
Можно ли задать targetNamespace? Схема создаётся без пространства имён. Добавьте targetNamespace и xmlns в корень результата — проверка сразу покажет, если ссылки на типы нужно дополнить префиксом.
Массив массивов — как он выглядит в XML? Внутренний массив передаётся элементами <item> — окно предупредит об этом.
