Вступление
Понадобилось мне для XML схемы формата CommerceML2 сделать человекочитаемую документацию. Очень удобно, знаете ли вместо такого документа
<complextype name="КоммерческаяИнформация">
<annotation>
<documentation>
Собирательный компонент для всего, что может быть упомянуто в процессе обмена
</documentation>
</annotation>
<sequence>
<element ref="cml:Классификатор" minoccurs="0"></element>
<choice>
<element ref="cml:Каталог" minoccurs="0"></element>
<element ref="cml:ПакетПредложений" minoccurs="0"></element>
<element ref="cml:Документ" minoccurs="0" maxoccurs="unbounded"></element>
<element ref="cml:ИзмененияПакетаПредложений" minoccurs="0" maxoccurs="unbounded"></element>
</choice>
</sequence>
<attribute name="ВерсияСхемы" use="required">
<simpletype>
<restriction base="xsd:string">
<maxlength value="5"></maxlength>
</restriction>
</simpletype>
</attribute>
<attribute name="ДатаФормирования" type="cml:ДатаВремяТип" use="required"></attribute>
</complextype>
пользоваться при разработке вот таким
Сказано - сделано, тем более ничего сложного в этом нет. Делаю следующие шаги.
На сайте v8.1c.ru я скачал файл схемы и сохранил его в файл CommerceML2-10.xsd.
На сайте liquid-technologies.com я скачал триальную версию замечательного и очень дорогого продукта Liquid Studio. Компания Liquid technologies дает полнофункциональную лицензию на 15 дней. После установки запустите программу и воспользуйтесь мастером получения триальной лицензии.
Открыл ранее скачанный файл XML схемы в Liquid Studio и остался последний шаг, воспользоваться командой Tols - Generate Documentation, но...
получаю список ошибок.
Выясняю, что не так с этой схемой и прихожу к выводу, что руками мне ее править (приводить в порядок) ужас как не хочется.
Задача
Данный скрипт исправляет следующие ошибки:
У открывающих и закрывающих тегов узлов схемы устанавливается префикс пространства имен w3.org, объявленный в заголовке схемы.
<!-- пример заголовока схемы -->
<schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cml="urn:1C.ru:commerceml_2" targetnamespace="urn:1C.ru:commerceml_2">
<!-- было -->
<simpletype>
<restriction base="cml:НаименованиеТип"></restriction>
</simpletype>
<!-- стало -->
<xsd:simpletype>
<xsd:restriction base="cml:НаименованиеТип"></xsd:restriction>
</xsd:simpletype>
Наименования узлов схемы регистрозависимые, поэтому наименование узла simpletype
неправильно, а simpleType
правильно. Для этого был создан словарь в соответствии с пространством имен w3.org по которому и переименовываются проблемные наименования.
<!-- было -->
<xsd:simpletype>
<xsd:restriction base="cml:НаименованиеТип"></xsd:restriction>
</xsd:simpletype>
<!-- стало -->
<xsd:simpleType>
<xsd:restriction base="cml:НаименованиеТип"></xsd:restriction>
</xsd:simpleType>
Зависимости
Скрипт разработан в среде OScript 1.3.0 Тестирование на более ранних версиях интерпретатора не проводилось.
Требуется библиотека cmdline Установите библиотеку через пакетный менеджер OScript: opm install cmdline
Устанавливайте библиотеку в окне CMD, которое запущено от имени администратора.
Параметры
У скрипта один аргумент командной строки
-path <полный путь к схеме> - полный путь, включающий имя файла обрабатываемой XML схемы
Результат
Скрипт получает префикс пространства имен w3.org из атрибута xmlns:xsd="http://www.w3.org/2001/XMLSchema"
заголовка XML схемы
Скрипт определяет необходимость устанавливать префикс в тегах по узлу <xsd:schema
Если узел schema
уже с префиксом, то считаю, что вся схема с префиксами.
Скрипт, если нужно, устанавливает префикс пространства имен w3.org в открывающих и закрывающих тегах XML схемы
Скрипт по словарю меняет наименования элементов, в которых используется camelCase стиль, пример simpleType
Скрипт создает новый результирующий файл XML схемы с суффиксом _modify
Примеры использования
oscript cxs.os -path d:\tmp\CommerceML2-10.xsd
где d:\tmp\CommerceML2-10.xsd
- путь к файлу, который нужно обработать
Заключение
Наведя порядок в XML схеме, я сформировал документацию, с которой можно удобно работать.
Страничка этого проекта на GitHub