Чтение XML по XSD схеме, как проверить существование элемента в Списке?
Добрый день. Есть задача прочитать xml файл для последующей обработки его содержимого ( Файл xml примерно 300 000 строк, читать нужно каждый день)
Прочитал несколько статей по чтению xml, выбрал для себя одну из самых понятных (Способ №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>;
<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 как то задать "Значение по умолчанию" для элемента даже если его нет в строке последовательности?
Или есть более изящный метод избавится от такого количества проверок ?
Прочитал несколько статей по чтению xml, выбрал для себя одну из самых понятных (Способ №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>;
<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 как то задать "Значение по умолчанию" для элемента даже если его нет в строке последовательности?
Или есть более изящный метод избавится от такого количества проверок ?
Найденные решения
(2)Добрый день, спасибо за ответ попробую, когда в след. раз придется разбирать сложную схему. Пока нашел неочевидное решение:
Создавать фабрику XDTO без схемы XSD и при чтении заполнять не структуру конструкцией
А заполнять ТЗ имеющую колонки с нужными мне свойствами, в начале цикла заполнять строку тч стандартными значениями свойств, а затем .
Неочевидно, но по замеру производительности такой способ отрабатывает в 2 раза быстрее...
Создавать фабрику XDTO без схемы XSD и при чтении заполнять не структуру конструкцией
Если Объект.Получить(Объект.Свойства().ИскомоеСвойство) <> Неопределено Тогда ... А заполнять ТЗ имеющую колонки с нужными мне свойствами, в начале цикла заполнять строку тч стандартными значениями свойств, а затем
ЗаполнитьЗначенияСвойств(СтрокаТЗ,Объект)Неочевидно, но по замеру производительности такой способ отрабатывает в 2 раза быстрее...
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)Добрый день, спасибо за ответ попробую, когда в след. раз придется разбирать сложную схему. Пока нашел неочевидное решение:
Создавать фабрику XDTO без схемы XSD и при чтении заполнять не структуру конструкцией
А заполнять ТЗ имеющую колонки с нужными мне свойствами, в начале цикла заполнять строку тч стандартными значениями свойств, а затем .
Неочевидно, но по замеру производительности такой способ отрабатывает в 2 раза быстрее...
Создавать фабрику XDTO без схемы XSD и при чтении заполнять не структуру конструкцией
Если Объект.Получить(Объект.Свойства().ИскомоеСвойство) <> Неопределено Тогда ... А заполнять ТЗ имеющую колонки с нужными мне свойствами, в начале цикла заполнять строку тч стандартными значениями свойств, а затем
ЗаполнитьЗначенияСвойств(СтрокаТЗ,Объект)Неочевидно, но по замеру производительности такой способ отрабатывает в 2 раза быстрее...
Похожий механизм используется для проверки наличия реквизита у объекта:
Функция ЕстьРеквизитОбъекта(Объект, ИмяРеквизита)
СлучайноеЗначение = Новый УникальныйИдентификатор();
Буфер = Новый Структура(ИмяРеквизита, СлучайноеЗначение);
ЗаполнитьЗначенияСвойств(Буфер, Объект);
Возврат Буфер[ИмяРеквизита] <> СлучайноеЗначение;
КонецФункции
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот