1. ZMGMSC 67 11.10.18 09:56 Сейчас в теме

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

Подскажите как лучше сделать процедуру (функцию)
чтобы написать и забыть :)
Смысл, передавать структуру как параметр а на выходе получить XML
Может есть у кого готовое решение ?
Вознаграждение за ответ
Показать полностью
Ответы
Избранное Подписка Сортировка: Древо
3. Boneman 213 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Данных.Закрыть(); 
	Возврат Параметр; 
КонецФункции
Показать

Это требовалось?)
4. softcom_1c 13 11.10.18 10:25 Сейчас в теме
Можно еще так:

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

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


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

//Кстати такой же метод есть и для JSON.
5. ZMGMSC 67 11.10.18 10:55 Сейчас в теме
JSON и XML практически одинаковые

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

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

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

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

тем более ответ от сервисов приходит скудный.
15. Ditron 69 11.10.18 14:22 Сейчас в теме
(14) если вы используете чьи-то сервисы, без схем или пакетов не обойтись, любой XML подразумевает точную схему, более того, у большинства сервисов даже чувствительность к регистру имен тегов присутствует. По возможности JSON, там вообще все просто, встроенные в платформу механизмы преобразования в структуру и обратно
16. Ditron 69 11.10.18 14:23 Сейчас в теме
(15)но в JSON нет пространства имен, так что все ручками...
17. Green2 28 12.10.18 10:10 Сейчас в теме
(14)Может вам стоит нарисовать что вы имеете на входе и что вы должны получить на выходе.
Если у вас нет схемы, то советую взяться за ручку.
18. ZMGMSC 67 12.10.18 13:00 Сейчас в теме +5 $m
Придется взять учебник по XML
чтобы было понимание.
Я понял одно - готовое решение тут не возможно.
19. Infector 125 12.10.18 22:26 Сейчас в теме
Делал что-то похожее, но с соответствиями. Структура не подошла из-за того, что клиенты задвинули экзотический тэг, который для ключа структуры не годится.
20. Infector 125 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, Значение, Ключ);	
			КонецЕсли;
		КонецЕсли;	
		
	КонецЦикла;	//Для Каждого Тэг Из Соответствие Цикл
	
КонецФункции
Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Бизнес-аналитик 1С ERP
Пермь
зарплата от 80 000 руб.
Полный день

Программист 1С УТ 11
Омск
зарплата от 60 000 руб.
Полный день

Бизнес-аналитик 1С УТ 11
Омск
зарплата от 60 000 руб.
Полный день

Программист 1С
Воронеж
Полный день

Программист 1С
Воронеж
Полный день