В процессе интеграции систем нередко приходится сталкиваться с файлами формата XML, которые были сформированы устаревшими версиями платформ или сторонним софтом. Часто такие файлы не соответствуют стандартам W3C, из-за чего стандартные инструменты, такие как ЧтениеXML или ФабрикаXDTO, могут выдавать ошибки. Давайте разберем, как поступить, если файл представляет собой текстовую структуру, имитирующую атрибуты, но при этом является «кривым» с точки зрения парсера.
Прежде чем приступать к написанию кода, проанализируем структуру нашего файла. Если внутри тега данные записаны как Ключ="Значение", а сам файл при этом не читается как объектное дерево, мы должны сменить подход и работать с ним как с обычным текстовым документом. Мы не будем пытаться «подружить» кривой формат с валидатором, а поймем, как извлечь нужную нам пару ключ-значение программно.
Этот метод является самым гибким. Мы считаем файл в переменную, разобьем его на массив строк и последовательно обработаем каждую. Давайте разберем этот процесс по шагам:
ТекстовыйДокумент.=, чтобы отделить имя ключа от значения.Посмотрим, как это выглядит в коде:
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("путь_к_файлу.xml", "windows-1251");
СоответствиеДанных = Новый Соответствие;
Для Индекс = 1 По Текст.КоличествоСтрок() Цикл
СтрокаСодержимого = СокрЛП(Текст.ПолучитьСтроку(Индекс));
// Ищем позицию знака равенства
ПозицияРавно = СтрНайти(СтрокаСодержимого, "=");
Если ПозицияРавно > 0 Тогда
Ключ = Лев(СтрокаСодержимого, ПозицияРавно - 1);
Значение = Сред(СтрокаСодержимого, ПозицияРавно + 1);
// Удаляем кавычки из значения
Значение = СтрЗаменить(Значение, """", "");
СоответствиеДанных.Вставить(Ключ, Значение);
КонецЕсли;
КонецЦикла;
Разберем методы, которые мы здесь использовали: СтрНайти позволяет определить позицию разделителя в строке, Лев и Сред помогают филигранно вырезать нужные фрагменты, а СтрЗаменить очищает данные от «мусора» в виде кавычек.
Если вам критически важно использовать встроенные возможности платформы для работы с XML, можно произвести «препроцессинг» файла. Если файл небольшой, мы можем считать его целиком в строку, заменить переносы строк на пробелы и дописать недостающие закрывающие теги. После такой манипуляции файл станет валидным, и вы сможете использовать метод ПолучитьАтрибут().
Важное примечание: При работе с атрибутами важно помнить, что XML чувствителен к закрывающим скобкам. Если исходный файл содержит избыточные символы, их стоит удалить функцией СтрЗаменить до начала парсинга.
Использование объекта Соответствие — это наиболее эффективный способ хранения пар ключ-значение. Во-первых, это дает нам возможность мгновенного доступа к нужному значению по известному ключу (через метод Получить), во-вторых, мы полностью абстрагируемся от порядка следования данных в файле. Даже если в будущем формат файла изменится и ключи поменяются местами, наш код останется работоспособным.
Чтобы ваша разработка была профессиональной, всегда старайтесь учитывать следующие моменты:
1С 7.7 (обычно это windows-1251).ЧтениеТекста вместо ТекстовыйДокумент — это сэкономит оперативную память.Теперь вы знаете, как быстро и надежно извлечь данные из файлов с нестандартной структурой. Сочетание функций СтрНайти, Лев, Сред и использование Соответствие поможет вам автоматизировать любую задачу по парсингу данных!