Преобразование XML - Структура и обратно

1. ZMGMSC 73 11.10.18 09:56 Сейчас в теме
Подскажите как лучше сделать процедуру (функцию)
чтобы написать и забыть :)
Смысл, передавать структуру как параметр а на выходе получить XML
Может есть у кого готовое решение ?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Boneman 298 11.10.18 10:18 Сейчас в теме
(1) если конфа типовая, то там готовые функции уже есть

ОбщегоНазначения.ЗначениеВСтрокуXML(Значение)

и
ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML)
2. shilanser 11.10.18 10:01 Сейчас в теме
Доброго времени суток!
Функция Сериализовать(ОбъектСериализации) 
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации); 
	МойXML = Новый ЗаписьXML; 
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO); 
	Возврат МойXML.Закрыть(); 
КонецФункции


Функция Десериализовать(XMLСтруктура) 
	ЧтениеXMLДанных = Новый ЧтениеXML; 
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктура); 
	Параметр = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных); 
	ЧтениеXMLДанных.Закрыть(); 
	Возврат Параметр; 
КонецФункции
Показать

Это требовалось?)
user830833; kuznetsov1c; DrAku1a; NekoZver; johnnyshut23; Alexwarsis; +6 Ответить
4. softcom_1c 20 11.10.18 10:25 Сейчас в теме
Можно еще так:

МойXML = Новый ЗаписьXML;
//Далее устанавливаем файл или поток, если нужно получить XML в виде строчки...

ЗаписатьXML(МойXML , МояСтруктура);


//Потом получить структуру обратно можно будет при помощи "ПрочитатьXML()";

//Кстати такой же метод есть и для JSON.
johnnyshut23; +1 Ответить
21. user645799_spam_gds 10.10.19 12:43 Сейчас в теме
(4)Бьюсь уже 4 часа.
		ЗаписьXML = новый ЗаписьXML;
		ЗаписьXML.УстановитьСтроку("UTF-8");
		Значение = новый Структура("a", "a1");
		ЗаписатьXML(ЗаписьXML, Значение);
		СтрокаТелаОтвета = ЗаписьXML.Закрыть();

Результат: "Ошибка при вызове метода контекста (ЗаписатьXML)".

Что не так???
(4)
22. spacecraft 10.10.19 13:12 Сейчас в теме
(21) из СП:
Значения не всех типов могут быть записаны в формате XML данным методом.
В XML могут быть записаны значения следующих типов: Неопределено, Null, Булево, Число, Строка, Дата, Тип, УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения, ОписаниеТипов, а также ссылки объектов данных и сами объекты данных, наборы записей регистров, менеджер значения константы. В дальнейшем список может пополняться.
При попытке записи значения неподходящего типа будет вызвано исключение.

Структуры в допустимых типах нет.
user645799_spam_gds; +1 Ответить
5. ZMGMSC 73 11.10.18 10:55 Сейчас в теме
JSON и XML практически одинаковые

смущает в XML как правильно задавать пространство имен и указывать его в тегах.

просто объект сериализавать в XML просто.
6. ZMGMSC 73 11.10.18 11:06 Сейчас в теме
я не точно сформулировал вопрос наверное.
XML нужно собирать для обмена с внешними сервисами с указанием пространства имен
и типа данных.
Поэтому типовые не совсем подходят. Если их только потом не корректировать.
7. Dream_kz 129 11.10.18 11:11 Сейчас в теме
8. ZMGMSC 73 11.10.18 11:15 Сейчас в теме
10. Dream_kz 129 11.10.18 11:38 Сейчас в теме
(8) Делаем пакет XDTO с нужной структурой, там можно и пространство имен задать. Затем создаем объект из этого пакета, заполняем его, потом фабрика сформирует XML нужного формата

ТипДок = ФабрикаXDTO.Тип("DataTransfer","DocumentObject.ОстаткиНоменклатуры");
	
	Док = ФабрикаXDTO.Создать(ТипДок);
	//здесь заполняем объект
	ФайлXML = Новый ЗаписьXML;
	ФайлXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(ФайлXML, Док);
	ТекстВозврата = ФайлXML.Закрыть();
Показать
11. dusha0020 1104 11.10.18 11:55 Сейчас в теме
(10) Фабрика привязана к набору и типам данных. А стартер, очевидно, хочет преобразовывать произвольные структуры.
12. ZMGMSC 73 11.10.18 11:57 Сейчас в теме
http://schemas.xmlsoap.org/soap/envelope/">
с такой шляпой и типы о клиента могут быть свои
13. dusha0020 1104 11.10.18 12:04 Сейчас в теме
Вопрос, имхо, сформулирован очень широко.
Если исходная структура может состоять только из примитивных типов, то решение простое. Строк на 10-12 кода.
Если могут быть сложные и составные типы - то без схемы данных не обойтись.
А вообще зачем генерить и читать XML произвольной структуры? Может быть у Вашей задачи имеется более простое решение?
14. ZMGMSC 73 11.10.18 13:01 Сейчас в теме
Если бы все было просто :)
хочется упростить компановку выходного файла
и ускорить разработку.

Все ошибки xml меня сильно достают.

тем более ответ от сервисов приходит скудный.
15. Ditron 184 11.10.18 14:22 Сейчас в теме
(14) если вы используете чьи-то сервисы, без схем или пакетов не обойтись, любой XML подразумевает точную схему, более того, у большинства сервисов даже чувствительность к регистру имен тегов присутствует. По возможности JSON, там вообще все просто, встроенные в платформу механизмы преобразования в структуру и обратно
16. Ditron 184 11.10.18 14:23 Сейчас в теме
(15)но в JSON нет пространства имен, так что все ручками...
17. Green2 29 12.10.18 10:10 Сейчас в теме
(14)Может вам стоит нарисовать что вы имеете на входе и что вы должны получить на выходе.
Если у вас нет схемы, то советую взяться за ручку.
18. ZMGMSC 73 12.10.18 13:00 Сейчас в теме +5 $m
Придется взять учебник по XML
чтобы было понимание.
Я понял одно - готовое решение тут не возможно.
19. Infector 201 12.10.18 22:26 Сейчас в теме
Делал что-то похожее, но с соответствиями. Структура не подошла из-за того, что клиенты задвинули экзотический тэг, который для ключа структуры не годится.
20. Infector 201 13.10.18 15:22 Сейчас в теме
(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, Значение, Ключ);	
			КонецЕсли;
		КонецЕсли;	
		
	КонецЦикла;	//Для Каждого Тэг Из Соответствие Цикл
	
КонецФункции
Показать
user712340_lost-s0u1; native-api; Drizer2000; KroVladS; HAMAZ; nayaru1; +6 Ответить
23. пользователь 21.11.23 12:58
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот