Генерация схемы xsd из файла xml
1C-admin
28.03.2019
Утилита, генерирующая xsd схему на основании xml файла.
Утилита разработана мной для экономии времени при проектировании XDTO пакета.
При отправке данных какому-либо сервису в Интернете зачастую они должны быть сериализованы. Здесь есть два варианта:
- Сервис использует SOAP. Вопросов с сериализацией возникать не должно (опустим те случаи, когда средства платформы не позволяют корректно прочитать описание сервиса).
- Сервис реализован согласно архитектуре REST API. В данном случае разработка "шаблона" для сериализации данных лежит на разработчике системы, которая обращается к сервису.
Рассмотрим простой пример. Нужно отправить данные некого документа учетной системы сервису, который имеет архитектуру REST. Есть адрес конечной точки и шаблон xml, согласно которому должен быть сериализован документ. Пусть он выглядит следующим образом.
Шаблон сериализованного документа
<?xml version="1.0" encoding="UTF-8" ?>
<invoice>
<general>
<currency>USD</currency>
<isPaid>true</isPaid>
</general>
<seller>
<legalName>Trade LLC</legalName>
<taxCode>558731212</taxCode>
<addressLine>CA</addressLine>
<phoneNumber>784875863</phoneNumber>
<bankName>World bank</bankName>
<bankAccount>111177</bankAccount>
</seller>
<buyer>
<name>Tom Smith</name>
<taxCode>87312131</taxCode>
<addressLine>CA</addressLine>
<phoneNumber>95453121312</phoneNumber>
</buyer>
<itemInfo>
<lineNumber>1</lineNumber>
<code>0001</code>
<name>Software</name>
<unit>ea</unit>
<price>1000</price>
<quantity>10</quantity>
<totalAmountWithoutTax>9000</totalAmountWithoutTax>
<vatRate>10</vatRate>
<taxAmount>1000</taxAmount>
<discount>0</discount>
</itemInfo>
<total>
<amountWithoutTax>9000</amountWithoutTax>
<taxAmount>1000</taxAmount>
<amountWithTax>10000</amountWithTax>
<amountWithTaxInWords>Ten thousands</amountWithTaxInWords>
</total>
</invoice>
Здесь есть несколько вариантов реализации такого "шаблона":
-
Создание структуры данных программно
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);
XDTOSerializer.WriteXML(XMLWriter, Invoice);
- Создание пакета 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
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://v8.default.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="invoice" type="invoiceType"/>
<xs:complexType name="generalType">
<xs:sequence>
<xs:element type="xs:string" name="currency"/>
<xs:element type="xs:string" name="isPaid"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sellerType">
<xs:sequence>
<xs:element type="xs:string" name="legalName"/>
<xs:element type="xs:int" name="taxCode"/>
<xs:element type="xs:string" name="addressLine"/>
<xs:element type="xs:int" name="phoneNumber"/>
<xs:element type="xs:string" name="bankName"/>
<xs:element type="xs:int" name="bankAccount"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="buyerType">
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:int" name="taxCode"/>
<xs:element type="xs:string" name="addressLine"/>
<xs:element type="xs:long" name="phoneNumber"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemInfoType">
<xs:sequence>
<xs:element type="xs:byte" name="lineNumber"/>
<xs:element type="xs:byte" name="code"/>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="unit"/>
<xs:element type="xs:short" name="price"/>
<xs:element type="xs:byte" name="quantity"/>
<xs:element type="xs:short" name="totalAmountWithoutTax"/>
<xs:element type="xs:byte" name="vatRate"/>
<xs:element type="xs:short" name="taxAmount"/>
<xs:element type="xs:byte" name="discount"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="totalType">
<xs:sequence>
<xs:element type="xs:short" name="amountWithoutTax"/>
<xs:element type="xs:short" name="taxAmount"/>
<xs:element type="xs:short" name="amountWithTax"/>
<xs:element type="xs:string" name="amountWithTaxInWords"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="invoiceType">
<xs:sequence>
<xs:element type="generalType" name="general"/>
<xs:element type="sellerType" name="seller"/>
<xs:element type="buyerType" name="buyer"/>
<xs:element type="itemInfoType" name="itemInfo"/>
<xs:element type="totalType" name="total"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
После работы утилиты, полученную схему xsd можно импортировать в 1С:Предприятие в режиме Конфигуратор. Получится такой вот пакет XDTO
Я не просто употребил слово прототипирование, так как только разработчик схемы xsd (пакета XDTO) может знать, что некое поле имеет тип int, а не long или оно может быть пустым, а не обязательным к заполнению и т.д. Другими словами, такой пакет конечно можно использовать далее, но по факту это всего лишь заготовка. Также на качество генерируемой схемы влияет сложность файла xml. Удачи в разработке!
Проект доступен на GitHub
Круто конечно. Но Liquid Studio 2018 же такое умеет
(1) Спасибо ) Конечно есть, есть еще сервисы в Интернете (в этом случае вообще ничего устанавливать не нужно )) )
Используюxmlpad для тех же целей. Опять же — можно в визуальном редакторе поправить результат, да и куча других функций в наличии.
Раз уж здесь стали размещать ссылки на аналогичные инструменты, то тоже поделюсь ссылкой на решение, которое публиковалось ранее на Инфостарте:Автоматическое создание XSD-файла по выбранным типам объектов конфигурации для загрузки в XDTO пакет в 1С 8.3 .
Но автору всё равно спасибо за альтернативу и открытые исходники, тем более на Java. Пока что таких материалов мало и они точно не лишние, а очень даже полезные.
(4) Спасибо за комментарий
Я видел этот инструмент, более того задавал вопрос автору в комментариях — но он по какой-то причине оставил это без внимания.
(1)
Но только в коммерческой версии за $297.00.
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
Как минимум нужно писать СериализаторXDTO.WriteXML
(8)Согласен, писал для общего понимания. Только СериализаторXDTO знает об объектах платформы.
Спасибо за замечние, поправлю.
(9) Фух, спасибо