При работе с внешними источниками данных, например при получении электронных писем с вложениями или вызове web-сервисов, XML-документы часто поступают в виде объекта ДвоичныеДанные. Классический подход с сохранением вложений во временный файл на диске с последующим вызовом метода ОткрытьФайл() замедляет работу системы и создает лишнюю нагрузку на дисковую подсистему сервера.
Рассмотрим, как прочитать XML-структуру напрямую из оперативной памяти без создания промежуточных файлов на диске.
Наиболее эффективным и производительным способом является чтение данных через поток. Объект ДвоичныеДанные позволяет получить поток для чтения, который передается напрямую в объект ЧтениеXML.
Разберем по шагам реализацию данного подхода:
ДвоичныеДанные (например, из вложения входящего письма).ОткрытьПотокДляЧтения().ОткрытьПоток() объекта ЧтениеXML.Посмотрим на пример кода:
// Предположим, ДвоичныеДанныеXML содержат наш XML-документ
ПотокЧтения = ДвоичныеДанныеXML.ОткрытьПотокДляЧтения();
ПарсерXML = Новый ЧтениеXML;
ПарсерXML.ОткрытьПоток(ПотокЧтения);
Пока ПарсерXML.Прочитать() Цикл
// Обработка узлов XML-документа
КонецЦикла;
ПарсерXML.Закрыть();
ПотокЧтения.Закрыть();
Преимущество метода: Данный способ выполняет порционное чтение данных, что экономит оперативную память при работе с большими файлами. Кроме того, ЧтениеXML автоматически определяет кодировку документа и сигнатуру BOM из заголовка XML.
Если файл имеет небольшой размер, можно конвертировать двоичные данные в текстовую строку и загрузить её в парсер с помощью метода УстановитьСтроку().
Проанализируем пример выполнения этой операции:
// Преобразуем двоичные данные в текстовую строку
ТекстоваяСтрокаXML = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеXML, КодировкаТекста.UTF8);
ПарсерXML = Новый ЧтениеXML;
ПарсерXML.УстановитьСтроку(ТекстоваяСтрокаXML);
Пока ПарсерXML.Прочитать() Цикл
// Обработка узлов XML-документа
КонецЦикла;
ПарсерXML.Закрыть();
Особенности метода: Метод УстановитьСтроку() принимает только раскодированную текстовую строку, а не строку в формате Base64. При использовании функции ПолучитьСтрокуИзДвоичныхДанных() важно точно указывать исходную кодировку файла (например, UTF-8 или Windows-1251), иначе кириллические символы могут прочитаться некорректно.
Важно учитывать, что при загрузке больших XML-документов через УстановитьСтроку() весь текст помещается в оперативную память целиком, что может привести к повышенному расходу ресурсов сервера. Для больших файлов рекомендуется всегда использовать загрузку через поток ОткрытьПоток().