новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
Александр
Приватное сообщение
Новый заказчик

Разработка корректной XSD схемы для обработки xml файла в 1С

10 августа 2020 в 14:08:52 (3 года 36 недель 1 день 13 часов назад)
700
Текст задания
Есть файл xml с плавающей структурой.
Возможные варианты структуры

1. Основной, когда есть данные
<result>
<status>1</status> строка
<price_results>
<price_result>
<oem></oem> строка
<make_name></make_name> строка
<detail_name> </detail_name> строка
<qnt></qnt> число
<min_qnt></min_qnt> число
<cost></cost> число
<first_cost></first_cost> число
<raw_cost></raw_cost> число
<price_name></price_name> строка
<price_id></price_id> строка
<stat></stat> число
<sup_logo></sup_logo> строка
<visible_sup_logo></visible_sup_logo> строка
<min_delivery_day></min_delivery_day> число
<max_delivery_day></max_delivery_day> число
<art_type_id></art_type_id> строка
<selected_item></selected_item> булево
<hash_key></hash_key> строка
<selected_color></selected_color> строка
<sys_info></sys_info> строка
<weight></weight> число
<volume></volume> число
<supplier_id></supplier_id> строка
<supplier_inn></supplier_inn> строка
<mix_supplier></mix_supplier> строка
<full_comment></full_comment> строка
</price_result>
</price_results>
</result>

2. Когда нет данных
<result>
<status>1</status> строка
<price_results>
</price_results>
</result>

Мною были разработаны 2 варианта схем, но у каждой есть недостатки. Не силен в их составлении, полазил по публикациям, что смог то и получилось ))

1. Схема работает только для 1 варианта файла, на 2 варианте дает исключение, т.к не совпадает формат. Но по данной схеме 1С правильно определяет типы, на больших объемах данных (тестировалась на 20.000 + строк) работает в 1.5 раза быстрее, чем 2 схема.

СтрокаXSD = "<xs:schema xmlns:tns=""http://localhost/testXML"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://localhost/testXML"" attributeFormDefault=""unqualified"" elementFormDefault=""qualified"">
|<xs:complexType name=""result"">
| <xs:sequence>
| <xs:element name=""status"" type=""xs:string""/>
| <xs:element name=""price_results"" type=""tns:price_results"" maxOccurs=""unbounded""/>
| </xs:sequence>
|</xs:complexType>
|<xs:complexType name=""price_results"">
| <xs:sequence>
| <xs:element name=""price_result"" type=""tns:price_result"" maxOccurs=""unbounded""/>
| </xs:sequence>
|</xs:complexType>
|<xs:complexType name=""price_result"">
| <xs:sequence>
| <xs:element name=""oem"" type=""xs:string""/>
| <xs:element name=""make_name"" type=""xs:string""/>
| <xs:element name=""detail_name"" type=""xs:string""/>
| <xs:element name=""qnt"" type=""xs:decimal""/>
| <xs:element name=""min_qnt"" type=""xs:decimal""/>
| <xs:element name=""cost"" type=""xs:decimal""/>
| <xs:element name=""first_cost"" type=""xs:decimal""/>
| <xs:element name=""raw_cost"" type=""xs:decimal""/>
| <xs:element name=""price_name"" type=""xs:string""/>
| <xs:element name=""price_id"" type=""xs:string""/>
| <xs:element name=""stat"" type=""xs:decimal""/>
| <xs:element name=""sup_logo"" type=""xs:string""/>
| <xs:element name=""visible_sup_logo"" type=""xs:string""/>
| <xs:element name=""min_delivery_day"" type=""xs:decimal""/>
| <xs:element name=""max_delivery_day"" type=""xs:decimal""/>
| <xs:element name=""art_type_id"" type=""xs:string""/>
| <xs:element name=""selected_item"" type=""xs:boolean""/>
| <xs:element name=""hash_key"" type=""xs:string""/>
| <xs:element name=""selected_color"" type=""xs:string""/>
| <xs:element name=""sys_info"" type=""xs:string""/>
| <xs:element name=""weight"" type=""xs:decimal""/>
| <xs:element name=""volume"" type=""xs:decimal""/>
| <xs:element name=""supplier_id"" type=""xs:string""/>
| <xs:element name=""supplier_inn"" type=""xs:string""/>
| <xs:element name=""mix_supplier"" type=""xs:string""/>
| <xs:element name=""full_comment"" type=""xs:string""/>
| </xs:sequence>
|</xs:complexType>
|</xs:schema>";

2. Схема работает при двух вариантах файла, но 1С по ней не определяет типы (везде определяется как строка) и в случае пустых значений в качестве типа указывает "Объект XDTO"

СтрокаXSD = "<xs:schema attributeFormDefault=""unqualified"" elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
| <xs:element name=""result"" type=""resultType""/>
| <xs:complexType name=""price_resultType"">
| <xs:sequence>
| <xs:element type=""xs:string"" name=""oem""/>
| <xs:element type=""xs:string"" name=""make_name""/>
| <xs:element type=""xs:string"" name=""detail_name""/>
| <xs:element type=""xs:decimal"" name=""qnt""/>
| <xs:element type=""xs:decimal"" name=""min_qnt""/>
| <xs:element type=""xs:decimal"" name=""cost""/>
| <xs:element type=""xs:decimal"" name=""first_cost""/>
| <xs:element type=""xs:decimal"" name=""raw_cost""/>
| <xs:element type=""xs:string"" name=""price_name""/>
| <xs:element type=""xs:string"" name=""price_id""/>
| <xs:element type=""xs:decimal"" name=""stat""/>
| <xs:element type=""xs:string"" name=""sup_logo""/>
| <xs:element type=""xs:string"" name=""visible_sup_logo""/>
| <xs:element type=""xs:decimal"" name=""min_delivery_day""/>
| <xs:element type=""xs:decimal"" name=""max_delivery_day""/>
| <xs:element type=""xs:string"" name=""art_type_id""/>
| <xs:element type=""xs:boolean"" name=""selected_item""/>
| <xs:element type=""xs:string"" name=""hash_key""/>
| <xs:element type=""xs:string"" name=""selected_color""/>
| <xs:element type=""xs:string"" name=""sys_info""/>
| <xs:element type=""xs:decimal"" name=""weight""/>
| <xs:element type=""xs:decimal"" name=""volume""/>
| <xs:element type=""xs:string"" name=""supplier_id""/>
| <xs:element type=""xs:string"" name=""supplier_inn""/>
| <xs:element type=""xs:string"" name=""mix_supplier""/>
| <xs:element type=""xs:string"" name=""full_comment""/>
| </xs:sequence>
| </xs:complexType>
| <xs:complexType name=""price_resultsType"">
| <xs:sequence>
| <xs:element type=""price_resultType"" name=""price_result""/>
| </xs:sequence>
| </xs:complexType>
| <xs:complexType name=""resultType"">
| <xs:sequence>
| <xs:element type=""xs:decimal"" name=""status""/>
| <xs:element type=""price_resultsType"" name=""price_results""/>
| </xs:sequence>
| </xs:complexType>
|</xs:schema>";

Вообщем то задача наверное не сильно сложная, разработать корректную схему для предложенных вариантов, чтобы не вызывало исключений и правильно определялись типы при ее чтении.
К проекту прикрепил архив с 2-мя внешними обработками и 2-мя файлами xml. 1 внешняя обработка использует первую схему xsd, 2-ая соответственно вторую. Файлы xml надо положить в корень диска C, ну либо поправить в коде расположение файлов. С помощью обработок можно более детально ознакомиться с данной проблемой в режиме отладки.
0
Выбранные исполнители
Отклики
Предложения отсутствуют