Генерация схемы xsd из файла xml

Утилита, генерирующая xsd схему на основании xml файла.

Утилита разработана мной для экономии времени при проектировании XDTO пакета.


При отправке данных какому-либо сервису в Интернете зачастую они должны быть сериализованы. Здесь есть два варианта:

  1. Сервис использует SOAP. Вопросов с сериализацией возникать не должно (опустим те случаи, когда средства платформы не позволяют корректно прочитать описание сервиса).
  2. Сервис реализован согласно архитектуре REST API. В данном случае разработка "шаблона" для сериализации данных лежит на разработчике системы, которая обращается к сервису.

Рассмотрим простой пример. Нужно отправить данные некого документа учетной системы сервису, который имеет архитектуру REST. Есть адрес конечной точки и шаблон xml, согласно которому должен быть сериализован документ. Пусть он выглядит следующим образом.

 

 Шаблон сериализованного документа

Здесь есть несколько вариантов реализации такого "шаблона":

  •  

     Создание структуры данных программно

  • Создание пакета XDTO с нуля и последующее его использование в качестве "шаблона" структуры данных (подробнее)
  • Прототипирование пакета XDTO на основании схемы XSD 

Первые два варианта доступны "из коробки" 1С:Предприятие. Далее расскажу про реализацию третьего с использованием утилиты xml2xsd, написанной на языке Java (для запуска необходима JVM). Утилита имеет CLI интерфейс. Ниже список ключей, которые можно передать при запуске:

  • -i — путь к файлу xml (обязательный)
  • -o — путь к файлу xsd (если не указан, то схема будет сохранена в одной директории с исполняемым файлом)
  • -s — шаблон, согласно которому будет выполнена схема xsd. Доступны варианты Russian Doll (1), Salami Slice (2), Venetian Blind (3) (необязательный, по умолчанию 3). Подробнее о том, что это такое, можно почитать тут и тут.
  • -n — targetNamespace — целевое пространство имен схемы (необязательный, по умолчанию http://v8.default.com)

Приведу полученную схему по шаблону xml выше. Использовался дизайн схемы Venetian Blind, указано целевое пространство имен. Пример команды, которой можно это сделать

java -jar xml2xsd.jar -i d:example.xml -n http://mynamespace.com

 

 Полученная схема xsd

После работы утилиты, полученную схему xsd можно импортировать в 1С:Предприятие в режиме Конфигуратор. Получится такой вот пакет XDTO

Я не просто употребил слово прототипирование, так как только разработчик схемы xsd (пакета XDTO) может знать, что некое поле имеет тип int, а не long или оно может быть пустым, а не обязательным к заполнению и т.д. Другими словами, такой пакет конечно можно использовать далее, но по факту это всего лишь заготовка. Также на качество генерируемой схемы влияет сложность файла xml. Удачи в разработке!

Проект доступен на GitHub

10 Comments

  1. capitan

    Круто конечно. Но Liquid Studio 2018 же такое умеет

    Reply
  2. fr13

    (1) Спасибо ) Конечно есть, есть еще сервисы в Интернете (в этом случае вообще ничего устанавливать не нужно )) )

    Reply
  3. Fragster

    Использую xmlpad для тех же целей. Опять же — можно в визуальном редакторе поправить результат, да и куча других функций в наличии.

    Reply
  4. Vladimir Litvinenko

    Раз уж здесь стали размещать ссылки на аналогичные инструменты, то тоже поделюсь ссылкой на решение, которое публиковалось ранее на Инфостарте: Автоматическое создание XSD-файла по выбранным типам объектов конфигурации для загрузки в XDTO пакет в 1С 8.3.

    Но автору всё равно спасибо за альтернативу и открытые исходники, тем более на Java. Пока что таких материалов мало и они точно не лишние, а очень даже полезные.

    Reply
  5. fr13

    (4) Спасибо за комментарий

    Я видел этот инструмент, более того задавал вопрос автору в комментариях — но он по какой-то причине оставил это без внимания.

    Reply
  6. oldcopy

    (1)

    Круто конечно. Но Liquid Studio 2018 же такое умеет

    Но только в коммерческой версии за $297.00.

    Reply
  7. frkbvfnjh
    Invoice = New Structure;

    General = New Structure;

    General.Insert(«currency», «USD»);

    Invoice.Insert(«general», General);

    Seller = New Structure;

    Seller.Insert(«legalName», «Trade LLC»);

    Invoice.Insert(«seller», Seller);

    WriteXML(XMLWriter, Invoice);

    Я что то не понял, как такое возможно? Структуру же нельзя записать в XML

    Reply
  8. frkbvfnjh

    Как минимум нужно писать СериализаторXDTO.WriteXML

    Reply
  9. fr13

    (8)Согласен, писал для общего понимания. Только СериализаторXDTO знает об объектах платформы.

    Спасибо за замечние, поправлю.

    Reply
  10. frkbvfnjh

    (9) Фух, спасибо

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *