Преобразование 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, Значение, Ключ);
КонецЕсли;
КонецЕсли;
КонецЦикла; //Для Каждого Тэг Из Соответствие Цикл
КонецФункции
Показать
Для формирования XML с такой структурой (без атрибутов):
И обратного преобразования в структуру можно использовать следующие функции:
Передавать надо только первый параметр (структуру или текст XML соответственно).
<RequestDS>
<Request>
<Command>getinfo</Command>
<Version>1</Version>
<Certificate>4803FECF75257F2E9</Certificate>
<POSCode>45</POSCode>
</Request>
<Card>
<CardNumber>4000000220013446</CardNumber>
<Flags>0</Flags>
</Card>
<Card>
<CardNumber>4000000220013445</CardNumber>
<Flags>3</Flags>
</Card>
</RequestDS>
ПоказатьИ обратного преобразования в структуру можно использовать следующие функции:
Функция СтруктураВXML(Структура, Подструктура = Ложь, Запись = Неопределено)
Если Не Подструктура Тогда
Запись = Новый ЗаписьXML();
Запись.УстановитьСтроку();
КонецЕсли;
Для Каждого КлючЗначение Из Структура Цикл
Запись.ЗаписатьНачалоЭлемента(КлючЗначение.Ключ);
Если ЗначениеЗаполнено(КлючЗначение.Значение) И ТипЗнч(КлючЗначение.Значение) <> Тип("Структура") Тогда
Запись.ЗаписатьТекст(Строка(КлючЗначение.Значение));
ИначеЕсли ТипЗнч(КлючЗначение.Значение) = Тип("Структура") Тогда
СтруктураВXML(КлючЗначение.Значение, Истина, Запись)
КонецЕсли;
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Если Не Подструктура Тогда
Возврат Запись.Закрыть();
КонецЕсли;
КонецФункции
Функция XMLВСтруктуру(ТекстXML = Неопределено, ДокументDOM = Неопределено, СтруктураРезультат = Неопределено)
Если ТекстXML <> Неопределено Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
СтруктураРезультат = Новый Структура;
КонецЕсли;
Для Каждого Элемент Из ДокументDOM.ДочерниеУзлы Цикл
Если ТипЗнч(Элемент.ПервыйДочерний) = Тип("ТекстDOM") Тогда
СтруктураРезультат.Вставить(Элемент.ИмяУзла, Элемент.ПервыйДочерний.Данные);
ИначеЕсли ТипЗнч(Элемент.ПервыйДочерний) = Тип("ЭлементDOM") Тогда
НовоеЗначениеСтруктура = Новый Структура;
СтруктураРезультат.Вставить(Элемент.ИмяУзла, НовоеЗначениеСтруктура);
XMLВСтруктуру(, Элемент, НовоеЗначениеСтруктура);
КонецЕсли;
КонецЦикла;
Возврат СтруктураРезультат;
КонецФункции
ПоказатьПередавать надо только первый параметр (структуру или текст XML соответственно).
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот