Преобразование XML - Структура и обратно
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Доброго времени суток!
Это требовалось?)
Функция Сериализовать(ОбъектСериализации)
ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
МойXML = Новый ЗаписьXML;
МойXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
Возврат МойXML.Закрыть();
КонецФункции
Функция Десериализовать(XMLСтруктура)
ЧтениеXMLДанных = Новый ЧтениеXML;
ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктура);
Параметр = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
ЧтениеXMLДанных.Закрыть();
Возврат Параметр;
КонецФункции
ПоказатьЭто требовалось?)
Можно еще так:
МойXML = Новый ЗаписьXML;
//Далее устанавливаем файл или поток, если нужно получить XML в виде строчки...
ЗаписатьXML(МойXML , МояСтруктура);
//Потом получить структуру обратно можно будет при помощи "ПрочитатьXML()";
//Кстати такой же метод есть и для JSON.
МойXML = Новый ЗаписьXML;
//Далее устанавливаем файл или поток, если нужно получить XML в виде строчки...
ЗаписатьXML(МойXML , МояСтруктура);
//Потом получить структуру обратно можно будет при помощи "ПрочитатьXML()";
//Кстати такой же метод есть и для JSON.
(21) из СП:
Структуры в допустимых типах нет.
Значения не всех типов могут быть записаны в формате XML данным методом.
В XML могут быть записаны значения следующих типов: Неопределено, Null, Булево, Число, Строка, Дата, Тип, УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения, ОписаниеТипов, а также ссылки объектов данных и сами объекты данных, наборы записей регистров, менеджер значения константы. В дальнейшем список может пополняться.
При попытке записи значения неподходящего типа будет вызвано исключение.
В XML могут быть записаны значения следующих типов: Неопределено, Null, Булево, Число, Строка, Дата, Тип, УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения, ОписаниеТипов, а также ссылки объектов данных и сами объекты данных, наборы записей регистров, менеджер значения константы. В дальнейшем список может пополняться.
При попытке записи значения неподходящего типа будет вызвано исключение.
Структуры в допустимых типах нет.
(8) Делаем пакет XDTO с нужной структурой, там можно и пространство имен задать. Затем создаем объект из этого пакета, заполняем его, потом фабрика сформирует XML нужного формата
ТипДок = ФабрикаXDTO.Тип("DataTransfer","DocumentObject.ОстаткиНоменклатуры");
Док = ФабрикаXDTO.Создать(ТипДок);
//здесь заполняем объект
ФайлXML = Новый ЗаписьXML;
ФайлXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ФайлXML, Док);
ТекстВозврата = ФайлXML.Закрыть();
Показать
Вопрос, имхо, сформулирован очень широко.
Если исходная структура может состоять только из примитивных типов, то решение простое. Строк на 10-12 кода.
Если могут быть сложные и составные типы - то без схемы данных не обойтись.
А вообще зачем генерить и читать XML произвольной структуры? Может быть у Вашей задачи имеется более простое решение?
Если исходная структура может состоять только из примитивных типов, то решение простое. Строк на 10-12 кода.
Если могут быть сложные и составные типы - то без схемы данных не обойтись.
А вообще зачем генерить и читать XML произвольной структуры? Может быть у Вашей задачи имеется более простое решение?
(14) если вы используете чьи-то сервисы, без схем или пакетов не обойтись, любой XML подразумевает точную схему, более того, у большинства сервисов даже чувствительность к регистру имен тегов присутствует. По возможности JSON, там вообще все просто, встроенные в платформу механизмы преобразования в структуру и обратно
(19)Добрался таки до места размещения сей функции
Функция ЗаписатьСоответствие_в_XML(Соответствие, ЗаписьXML, Атрибуты = Ложь)
ПорядокСтр = Соответствие.Получить("ПорядокТэгов");
Если ПорядокСтр = Неопределено Тогда
МассивПорядок = Новый Массив;
Для Каждого Тэг Из Соответствие Цикл
МассивПорядок.Добавить(Тэг.Ключ);
КонецЦикла;
Иначе
ПорядокСтр = СтрЗаменить(ПорядокСтр, Символы.ПС, "");
ПорядокСтр = СтрЗаменить(ПорядокСтр, " ", "");
МассивПорядок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПорядокСтр, ",");
КонецЕсли;
Для Каждого Ключ Из МассивПорядок Цикл
Значение = Соответствие.Получить(Ключ);
Если ТипЗнч(Ключ) <> Тип("Строка") Тогда
Сообщить("Ошибка. Передан элемент с нетекстовым ключом!");
Продолжить;
КонецЕсли;
Если Ключ = "Атрибуты" ИЛИ Ключ = "Значение" Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Массив") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(Ключ); //Группа записей
Для Сч = 0 По Значение.Количество()-1 Цикл
Элем = Значение[Сч];
//ДокXML.ЗаписатьНачалоЭлемента(Ключ); //Запись
ЗаписатьСоответствие_в_XML(Элем, ЗаписьXML);
//ДокXML.ЗаписатьКонецЭлемента(); //Запись
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); //Группа записей
ИначеЕсли ТипЗнч(Значение) = Тип("Соответствие") Тогда
ВложенныеАтрибуты = Значение.Получить("Атрибуты");
ВложенноеЗначение = Значение.Получить("Значение");
Если ВложенноеЗначение <> Неопределено Тогда
Если ТипЗнч(ВложенноеЗначение) = Тип("Соответствие") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(Ключ);
Если ВложенныеАтрибуты <> Неопределено Тогда
ЗаписатьСоответствие_в_XML(ВложенныеАтрибуты, ЗаписьXML, Истина);
КонецЕсли;
ЗаписатьСоответствие_в_XML(ВложенноеЗначение, ЗаписьXML);
ЗаписьXML.ЗаписатьКонецЭлемента();
Продолжить;
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента(Ключ);
Если ВложенныеАтрибуты <> Неопределено Тогда
ЗаписатьСоответствие_в_XML(ВложенныеАтрибуты, ЗаписьXML, Истина);
КонецЕсли;
ЗаписьXML.ЗаписатьБезОбработки(Строка(ВложенноеЗначение));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента(Ключ);
Если ВложенныеАтрибуты <> Неопределено Тогда
ЗаписатьСоответствие_в_XML(ВложенныеАтрибуты, ЗаписьXML, Истина);
КонецЕсли;
ЗаписатьСоответствие_в_XML(Значение, ЗаписьXML);
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ИначеЕсли Атрибуты Тогда
//Если ЗначениеЗаполнено(Значение) И ТипЗнч(Значение) = Тип("Строка") Тогда
Если ЗначениеЗаполнено(Значение) Тогда
Если ТипЗнч(Значение) = Тип("Дата") Тогда
Значение = Формат(Значение, "ДФ=yyyy-MM-dd");
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
Значение = Строка(Число(Значение));
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут(Ключ,"", Значение);
Конецесли;
Иначе
Если ЗначениеЗаполнено(Значение) Тогда
Если ТипЗнч(Значение) = Тип("Дата") Тогда
Значение = Формат(Значение, "ДФ=yyyy-MM-dd");
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
Значение = Строка(Число(Значение));
КонецЕсли;
ЗаписатьXML(ЗаписьXML, Значение, Ключ);
КонецЕсли;
КонецЕсли;
КонецЦикла; //Для Каждого Тэг Из Соответствие Цикл
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот