Здравствуйте!
Подскажите пожалуйста, как правильно прочитать файл XML
Пытаюсь с файла заполнить табл. часть документа
Но пока не совсем выходит(
Такой код написал:
Собрал файл XML
<?xml version="1.0" encoding="UTF-8" ?>
- <Данные>
<Строка КПП="91111111" КодПо="000000" КодБюдж="1111111111" Сумма="11 552" />
</Данные>
Проблема в основном получается что если несколько строк, тогда у ДокументXDTO.Строка = тип "СписокXDTO"
А если одна строка (как в примере) тогда ДокументXDTO.Строка = тип "ОбъектXDTO"
И выходит ошибка
Подскажите пожалуйста, как правильно прочитать файл XML
Пытаюсь с файла заполнить табл. часть документа
Но пока не совсем выходит(
Такой код написал:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
фабрика = Новый ФабрикаXDTO;
ДокументXDTO = фабрика.ПрочитатьXML(ЧтениеXML);
Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого СтрокаТЧ Из ДокументXDTO.Строка Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла; ПоказатьСобрал файл XML
<?xml version="1.0" encoding="UTF-8" ?>
- <Данные>
<Строка КПП="91111111" КодПо="000000" КодБюдж="1111111111" Сумма="11 552" />
</Данные>
Проблема в основном получается что если несколько строк, тогда у ДокументXDTO.Строка = тип "СписокXDTO"
А если одна строка (как в примере) тогда ДокументXDTO.Строка = тип "ОбъектXDTO"
И выходит ошибка
По теме из базы знаний
- Выгрузка результата запроса в XML, структура которого берется из XML файла - образца.
- Элегантное чтение больших XML файлов
- УТ 11.1 Загрузка Заказа клиента из xml
- Основы языка запросов xpath, базовый синтаксис и применение в 1С 8.3 для работы с xml файлами сложной структуры
- Сбор данных из файла XML по заданным полям или проверка выгрузки данных в XML файле
Найденные решения
(12)
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
Результат = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
Результат.Вставить(Колонка.Имя);
КонецЦикла;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Данные = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Данные.Добавить(Результат);
КонецЦикла;
Возврат Данные;
КонецФункции // ()
//////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
СписокДанных = новый Массив;
Для Каждого Строка Из Данные Цикл
КаждуюСтрокуВСтруктуру = новый Структура;
КаждуюСтрокуВСтруктуру.Вставить("КПП", Строка(Строка.Значение.КПП));
КаждуюСтрокуВСтруктуру.Вставить("КодПо", Строка(Строка.Значение.КодПо));
КаждуюСтрокуВСтруктуру.Вставить("КодБюд", Строка(Строка.Значение.КодБюд));
КаждуюСтрокуВСтруктуру.Вставить("Сумма", Строка.Значение.СуммаПлатежаПоНалогу); // Можно как число записать
СписокДанных.Добавить(КаждуюСтрокуВСтруктуру);
КонецЦикла;
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлуДляЗаписи);
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокДанных);
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO);
Запись.Закрыть(); // документ готов!
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пример записи:
Пример Чтения:
Процедура ПримерЗаписи()
Выборка = запрос.Выполнить().Выбрать();
СписокНоменклатуры = новый Массив;
Пока Выборка.Следующий() Цикл
//Каждую номенклатуру помещаем в струткуру
ДанныеНоменклатуры = новый Структура("Код, Наименование, Ссылка, ЭтоГруппа, Родитель",
Выборка.Код, Выборка.Наименование,XMLСтрока(Выборка.Ссылка),Выборка.ЭтоГруппа,);
//Если есть родитель, то создаем рекурсивно родителя
Если НЕ Выборка.Родитель.Пустая() Тогда
ДанныеНоменклатуры.Родитель = ДобавитьРодителей(Выборка.Ссылка.Родитель);
КонецЕсли;
СписокНоменклатуры.Добавить(ДанныеНоменклатуры);
КонецЦикла;
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокНоменклатуры);
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO);
ДанныеXML = Запись.Закрыть(); // документ готов!
КонецПроцедуры
Функция ДобавитьРодителей(Родитель)
ДанныеРодителя = новый Структура("Код, Наименование, Ссылка, ЭтоГруппа, Родитель",
Родитель.Код, Родитель.Наименование,XMLСтрока(Родитель.Ссылка),Родитель.ЭтоГруппа,);
Если НЕ Родитель.Родитель.Пустая() Тогда
ДанныеРодителя.Родитель = ДобавитьРодителей(Родитель.Родитель);
КонецЕсли;
Возврат ДанныеРодителя;
КонецФункции
ПоказатьПример Чтения:
Процедура ПримерЧтения()
ТекстXML = ТвойТекстВХМL;
ЧтениеXML = новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
МассивНоменклатуры = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Для каждого Стр из МассивНоменклатуры Цикл
Номенклатура = СоздатьНоменклатуру(Стр);
КонецЦикла;
КонецПроцедуры
Функция СоздатьНоменклатуру(ДанныеНоменклатуры)
///Проверка на существование ссылки. Если ссылка найдена, пропускаем.
СсылкаНоменклатуры = XMLЗначение(Тип("СправочникСсылка.Номенклатура"),ДанныеНоменклатуры.Ссылка);
/// проверяем по реквизиту "ВерсияДанных"
Если НЕ ЗначениеЗаполнено(СсылкаНоменклатуры.ВерсияДанных) Тогда
Если ДанныеНоменклатуры.ЭтоГруппа Тогда
СПР = Справочники.Номенклатура.СоздатьГруппу();
Иначе
СПР = Справочники.Номенклатура.СоздатьЭлемент();
КонецЕсли;
СПР.УстановитьСсылкуНового(СсылкаНоменклатуры);
Иначе
СПР = СсылкаНоменклатуры.ПолучитьОбъект();
КонецЕсли;
СПР.Код = ДанныеНоменклатуры.Код;
СПР.Наименование = ДанныеНоменклатуры.Наименование;
///Если есть родитель, сначала нужно создать родителя, и так до самого корня начала
Если ДанныеНоменклатуры.Родитель <> Неопределено Тогда
СПР.Родитель = СоздатьНоменклатуру(ДанныеНоменклатуры.Родитель);
КонецЕсли;
СПР.Записать();
Возврат СПР.Ссылка;
КонецФункции Показать
(6) Ошибка выходит(
ПрочитатьXML)
{ВнешняяОбработка.ПолучитьДанныеИзСап_XML.Форма.Форма.Форма(9)}:
МассивСтрокДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Данные Форма: Элемент
Тип: {}anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Строка Форма: Элемент
Тип: {}anyType
Пытался так сделать
ПрочитатьXML)
{ВнешняяОбработка.ПолучитьДанныеИзСап_XML.Форма.Форма.Форма(9)}:
МассивСтрокДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Данные Форма: Элемент
Тип: {}anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Строка Форма: Элемент
Тип: {}anyType
Пытался так сделать
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
МассивСтрокДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого Стр Из МассивСтрокДокумента Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла; Показать
(11)
Код который создаёт XML файл
Код который создаёт XML файл
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
Результат = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
Результат.Вставить(Колонка.Имя);
КонецЦикла;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Данные = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Данные.Добавить(Результат);
КонецЦикла;
Возврат Данные;
КонецФункции // ()
//////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
Для Каждого Строка Из Данные Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
ЗаписьXML.ЗаписатьАтрибут("КПП", Строка(Строка.Значение.КПП));
ЗаписьXML.ЗаписатьАтрибут("КодПо", Строка(Строка.Значение.КодПо));
ЗаписьXML.ЗаписатьАтрибут("КодБюд", Строка(Строка.Значение.КодБюд));
ЗаписьXML.ЗаписатьАтрибут("Сумма", Строка(Строка.Значение.СуммаПлатежаПоНалогу));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Страны
ЗаписьXML.Закрыть(); Показать
(12)
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
Результат = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
Результат.Вставить(Колонка.Имя);
КонецЦикла;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Данные = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Данные.Добавить(Результат);
КонецЦикла;
Возврат Данные;
КонецФункции // ()
//////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
СписокДанных = новый Массив;
Для Каждого Строка Из Данные Цикл
КаждуюСтрокуВСтруктуру = новый Структура;
КаждуюСтрокуВСтруктуру.Вставить("КПП", Строка(Строка.Значение.КПП));
КаждуюСтрокуВСтруктуру.Вставить("КодПо", Строка(Строка.Значение.КодПо));
КаждуюСтрокуВСтруктуру.Вставить("КодБюд", Строка(Строка.Значение.КодБюд));
КаждуюСтрокуВСтруктуру.Вставить("Сумма", Строка.Значение.СуммаПлатежаПоНалогу); // Можно как число записать
СписокДанных.Добавить(КаждуюСтрокуВСтруктуру);
КонецЦикла;
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлуДляЗаписи);
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокДанных);
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO);
Запись.Закрыть(); // документ готов!
Показать
Этот код который я пытался заполнить документ
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
фабрика = Новый ФабрикаXDTO;
ДокументXDTO = фабрика.ПрочитатьXML(ЧтениеXML);
Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого СтрокаТЧ Из ДокументXDTO.Строка Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла; Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот