Удобный способ чтения XML

27.08.21

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Чтение XML

Пишу как заметку, чтобы самому не потерять , может и другим пригодится.

Есть много разных способов работы с XML файлом, например через последовательных обход или через построение DOM.

Легко гулятся вот такие снипеты про это : https://helpme1c.ru/chtenie-i-zapis-xml-v-yazyke-1s-8-3-8-2-v-primerax

 

Лично мне оба способа доступа к XML не нравятся. Вот решил поделится тем подходом который на мой вкус красивый.

Суть метода в конвертации XML в Соответствие (Функция ПрочитатьXMLВСоответствие) + Хэлпер для удобного чтения из соответствия (Функция ПрочитатьРеквизитСоотвествия).

Листинг :

Функция ПрочитатьXMLВСоответствие(XML, ТипПоследнегоЭлемента = Неопределено)    
    
    Ветка = Новый Соответствие;
    Значение = "";
    
    Пока XML.Прочитать() Цикл
        ТипУзла = XML.ТипУзла;
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ТипПоследнегоЭлемента = ТипУзлаXML.НачалоЭлемента; 
            Временно = Ветка.Получить(XML.Имя);
            Если Временно = Неопределено Тогда
                Ветка.Вставить(XML.Имя, ПрочитатьXMLВСоответствие(XML, ТипПоследнегоЭлемента));
            Иначе
                Если ТипЗнч(Временно) <> Тип("Массив") Тогда
                    Временно=ПреобразоватьВМассив(Временно);
                    Ветка.Вставить(XML.Имя, Временно);
                КонецЕсли;
                Временно.Добавить(ПрочитатьXMLВСоответствие(XML, ТипПоследнегоЭлемента));
            КонецЕсли;
        ИначеЕсли ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            ТипПоследнегоЭлемента = ТипУзлаXML.КонецЭлемента;
            Возврат ?(ЗначениеЗаполнено(Ветка), Ветка, Значение);
        ИначеЕсли ТипУзла = ТипУзлаXML.Текст И Не ТипПоследнегоЭлемента = ТипУзлаXML.Текст Тогда
            ТипПоследнегоЭлемента = ТипУзлаXML.Текст;
            Значение = Значение + XML.Значение;
            XML.Прочитать();
            Возврат Значение;
        КонецЕсли
    КонецЦикла;
    
    Возврат Ветка;
КонецФункции


Функция ПрочитатьРеквизитСоотвествия(Соответствие,Путь,ЗначениеОшибки=Неопределено) Экспорт
    
    МассивРеквизитов = СтрРазделить(Путь,".");
    
    Счетчик = 0;
    Пока Счетчик<МассивРеквизитов.Количество() Цикл
        Элемент = МассивРеквизитов[Счетчик]; 
        Если Лев(Элемент,1)="(" и Прав(Элемент,1)<>")" Тогда
            Счетчик2=Счетчик+1;
            Пока Счетчик2<МассивРеквизитов.Количество() и Прав(МассивРеквизитов[Счетчик],1)<>")" Цикл
                МассивРеквизитов[Счетчик]=МассивРеквизитов[Счетчик]+"."+МассивРеквизитов[Счетчик2];
                МассивРеквизитов.Удалить(Счетчик2);
            КонецЦикла;    
        КонецЕсли;
        Элемент = МассивРеквизитов[Счетчик]; 
        Если  Лев(Элемент,1)="(" и Прав(Элемент,1)=")" Тогда
            МассивРеквизитов[Счетчик]=Сред(Элемент,2,СтрДлина(Элемент)-2);
        КонецЕсли;        
        Счетчик=Счетчик+1;
    КонецЦикла;    
    
    Результат=Соответствие;
    Для каждого Реквизит из МассивРеквизитов Цикл
        Индекс=Неопределено;
        лФигурнаяСкобкаНачало=СтрНайти(Реквизит,"[");
        лФигурнаяСкобкаКонец=СтрНайти(Реквизит,"]");
        Если ЗначениеЗаполнено(лФигурнаяСкобкаНачало) и ЗначениеЗаполнено(лФигурнаяСкобкаКонец) Тогда
            Попытка
                Индекс=Число(Сред(Реквизит,лФигурнаяСкобкаНачало+1,лФигурнаяСкобкаКонец-лФигурнаяСкобкаНачало-1));
                Реквизит=СтрЗаменить(Реквизит,СтрШаблон("[%1]",Формат(Индекс,"ЧН=0; ЧГ=")),"");
            Исключение
            КонецПопытки;
        КонецЕсли;    
        
        Если ТипЗнч(Результат)=Тип("Соответствие") Тогда
            Результат=Результат.Получить(Реквизит);
        Иначе
            Результат=ЗначениеОшибки;
            Прервать;
        КонецЕсли;
        
        Если ТипЗнч(Результат)=Тип("Массив") и Индекс<>Неопределено и Результат.Количество()>Индекс Тогда
            Результат=Результат[Индекс];
        КонецЕсли;
    КонецЦикла;    
    
    Если Результат=Неопределено Тогда
        Результат=ЗначениеОшибки;
    КонецЕсли;    
    
    Возврат Результат;
    
КонецФункции    



Функция ПреобразоватьВМассив(Значение)
    Если ТипЗнч(Значение)<>Тип("Массив") Тогда
        ВременныйМассив=Новый Массив;
        ВременныйМассив.Добавить(Значение);
        Возврат ВременныйМассив
    Иначе
        Возврат Значение
    КонецЕсли;    
КонецФункции

Пример использования :

//АдресФайла - Адрес хранилища на сервере куда помещен файл, можно переписать на получение по пути из ФС

Файл = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = Файл.ОткрытьПотокДляЧтения(); 
	
Чтение = Новый ЧтениеXML();
Чтение.ОткрытьПоток(Поток);
	
//Чтение XML в соответствие
РезультатЧтения = ПрочитатьXMLВСоответствие(Чтение);
	
//Примеры произвольного доступа
ПримерДоступаСФигурнымиСкобками = ПрочитатьРеквизитСоотвествия(РезультатЧтения,"Message.Body.(Документ.РеализацияТоваровУслуг)");
ПримерДоступаПоИндексу = ПрочитатьРеквизитСоотвествия(РезультатЧтения,"Message.Body.(Документ.РеализацияТоваровУслуг[0]).КлючевыеСвойства.Дата");
//итд

Чтение.Закрыть();
Поток.Закрыть();

2й параметр у ПрочитатьРеквизитСоотвествия это строка отражающая полный путь до целевого реквизита соответствия

Скобки "()" используются для придания атомарности конструкции внутри скобки. Т.е в примере соответствие ключ будет прямо так и назван "Документ.РеализацияТоваровУслуг"

Скобки "[]" используются для доступа к массиву по индексу.

XML ЧтениеXML

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    145082    843    297    

436

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.20.x), также подходят для релиза 11.5 (11.5.19.x).

35000 руб.

23.07.2020    55308    253    73    

206

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    73829    196    154    

133

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    38000    106    69    

100

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

16260 руб.

18.02.2016    188751    612    534    

534

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.240.x) и БП 3.0 (3.0.169.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    25733    182    55    

139

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    173016    310    261    

386

SALE! 10%

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    197182    157    244    

287
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. capitan 2610 27.08.21 11:36 Сейчас в теме
Если вы на сервере, то почему не работать с XML файлом как с объектом ?
2. Malfarion 263 27.08.21 14:18 Сейчас в теме
(1) К сожалению ваш вопрос не понял. Если вы его попробуете развернуть , возможно я смогу вам ответить =)
6. capitan 2610 27.08.21 15:19 Сейчас в теме
(2)ОбъектXDTO будет с теми же реквизитами
Его можно в 2 строки создать из файла xml
7. Malfarion 263 27.08.21 16:11 Сейчас в теме
(6) Ваша правда, думаю что ОбъектXDTO вместо соответствия тоже подойдет, переписать хэлпер на чтение из ОбъектаXDTO.
Единственный минус который я вижу объекта XDTO что это аналог структуры и ключи там имеют строгие ограничения на названия. Все недопустимые символы заменяются что иногда может быть менее интуитивно.
8. capitan 2610 27.08.21 16:44 Сейчас в теме
(7)Большой плюс, что 1С за вас проверит корректность документа и если нужно соответствие схеме
Это же ответ на ваш единственный минус
Климов Сергей; +1 Ответить
9. Malfarion 263 27.08.21 16:51 Сейчас в теме
(8) Я тут плюсов не вижу, но вам спасибо за дельные замечания.
3. brr 184 27.08.21 14:42 Сейчас в теме
А почему в соответствие, дерево значений ведь удобнее? А что будете делать с повторяющимися элементами?
5. Malfarion 263 27.08.21 15:11 Сейчас в теме
(3) Вот построили вы дерево значений, как вы получите доступ к произвольной строке чтобы считать что-то. Будет то еще удовольствие и спагети кода из Строки.НайтиСтроки() итд.
4. Malfarion 263 27.08.21 15:09 Сейчас в теме
Все повторяющие элементы идут под общим ключом как массив. Я думаю достаточно взять любой XML файл и глянуть что получается =)
10. dhurricane 28.08.21 15:40 Сейчас в теме
Ветка.Удалить(XML.Имя);
Ветка.Вставить(XML.Имя, Временно);
Удаление здесь излишне.
11. Malfarion 263 28.08.21 18:48 Сейчас в теме
12. FractonKireyev 17.10.21 19:32 Сейчас в теме
Структура XML такая:

<Имя1 ...> ... </Имя1>
<Имя2 ...> ... </Имя2>
<Имя1 ...> ... </Имя1>
<Имя2 ...> ... </Имя2>
<Имя2 ...> ... </Имя2>

При этом нет прямого указания на количество строк <Имя2 ...> после <Имя1 ...> - сколько получилось, столько и получилось, но это важно для разбора и загрузки данных (например это количество строк в разделе). При этом <Имя2 ...> не подчинено <Имя1 ...>, но важен порядок следования.

Всё. Ваш алгоритм не справился.

А как быть с чтением атрибутов?
13. FrolT 12.09.24 10:57 Сейчас в теме
спасибо за готовые методы. все работает и действительно удобно.
Оставьте свое сообщение