Чтение XML по XSD схеме, как проверить существование элемента в Списке?

1. user1075930 19.05.21 16:59 Сейчас в теме
Добрый день. Есть задача прочитать xml файл для последующей обработки его содержимого ( Файл xml примерно 300 000 строк, читать нужно каждый день)

Прочитал несколько статей по чтению xml, выбрал для себя одну из самых понятных https://infostart.ru/public/311011/ (Способ №5).

Для моего файла составил схему, проверил на валидность - все ок, работает, но есть одно Но...

Отрывок из схемы :
<xs:element type="xs:string" name="model"/>
<xs:element type="xs:string" name="mainImage" default="noimage"/>
<xs:element type="xs:byte" name="step_count" fixed="0" />
<xs:element type="xs:string" name="producer" />
Отрывок из xml:
<model>ПЭУ 003 Указательная стрелка (200х200) РС-M //комплект, 2шт.// MIZAR SI</model>
<mainImage>https://www.tesli.com/upload/iblock/7ff/93b8cf4d_6e69_11e5_8733_0cc47a13d3da.jpg</mainImage>;
<step_count>1</step_count>
<producer>Световые технологии</producer>
<vendorCode>2501002550</vendorCode>
<series>ПЭУ</series>
ИЛИ
<model>ПЭУ 003 Указательная стрелка (200х200) РС-M //комплект, 2шт.// MIZAR SI</model>
<step_count>1</step_count>
<vendorCode>2501002550</vendorCode>
<series>ПЭУ</series>
Как видите любой (кроме model) элемент схемы может отсутствовать, что отрицательно сказывается на чтении XML (При чтении в отсутствующим элементе находится пустой объект)
Да, есть возможность проверить через объект ОбъектXDTO.Свойства присутствуют ли все свойства (кроме model) в объекте списка, НО это ужасно тормозит процесс чтения. Триста тысяч записей = больше миллиона проверок. В замере производительности проверки далеко обгоняют все остальные методы...
Вопрос возможно ли в схеме XSD как то задать "Значение по умолчанию" для элемента даже если его нет в строке последовательности?
Или есть более изящный метод избавится от такого количества проверок ?
Найденные решения
3. user1075930 25.05.21 16:51 Сейчас в теме
(2)Добрый день, спасибо за ответ попробую, когда в след. раз придется разбирать сложную схему. Пока нашел неочевидное решение:
Создавать фабрику XDTO без схемы XSD и при чтении заполнять не структуру конструкцией
Если Объект.Получить(Объект.Свойства().ИскомоеСвойство) <> Неопределено Тогда ... 

А заполнять ТЗ имеющую колонки с нужными мне свойствами, в начале цикла заполнять строку тч стандартными значениями свойств, а затем
ЗаполнитьЗначенияСвойств(СтрокаТЗ,Объект)
.
Неочевидно, но по замеру производительности такой способ отрабатывает в 2 раза быстрее...
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kasper076 107 25.05.21 14:07 Сейчас в теме
Попробуй использовать ПостроительDOM, ДокументDOM и ВычислитьВыражениеXPath. Возможно это будет быстрее.
3. user1075930 25.05.21 16:51 Сейчас в теме
(2)Добрый день, спасибо за ответ попробую, когда в след. раз придется разбирать сложную схему. Пока нашел неочевидное решение:
Создавать фабрику XDTO без схемы XSD и при чтении заполнять не структуру конструкцией
Если Объект.Получить(Объект.Свойства().ИскомоеСвойство) <> Неопределено Тогда ... 

А заполнять ТЗ имеющую колонки с нужными мне свойствами, в начале цикла заполнять строку тч стандартными значениями свойств, а затем
ЗаполнитьЗначенияСвойств(СтрокаТЗ,Объект)
.
Неочевидно, но по замеру производительности такой способ отрабатывает в 2 раза быстрее...
4. kasper076 107 27.05.21 14:34 Сейчас в теме
Похожий механизм используется для проверки наличия реквизита у объекта:
Функция ЕстьРеквизитОбъекта(Объект, ИмяРеквизита)
    СлучайноеЗначение = Новый УникальныйИдентификатор();
    Буфер = Новый Структура(ИмяРеквизита, СлучайноеЗначение);
    ЗаполнитьЗначенияСвойств(Буфер, Объект);
    Возврат Буфер[ИмяРеквизита] <> СлучайноеЗначение;
КонецФункции
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот