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

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

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

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

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


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

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

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

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

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

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

тем более ответ от сервисов приходит скудный.
15. Ditron 16 11.10.18 14:22 Сейчас в теме
(14) если вы используете чьи-то сервисы, без схем или пакетов не обойтись, любой XML подразумевает точную схему, более того, у большинства сервисов даже чувствительность к регистру имен тегов присутствует. По возможности JSON, там вообще все просто, встроенные в платформу механизмы преобразования в структуру и обратно
16. Ditron 16 11.10.18 14:23 Сейчас в теме
(15)но в JSON нет пространства имен, так что все ручками...
17. Green2 26 12.10.18 10:10 Сейчас в теме
(14)Может вам стоит нарисовать что вы имеете на входе и что вы должны получить на выходе.
Если у вас нет схемы, то советую взяться за ручку.
18. ZMGMSC 68 12.10.18 13:00 Сейчас в теме +5 $m
Придется взять учебник по XML
чтобы было понимание.
Я понял одно - готовое решение тут не возможно.
19. Infector 124 12.10.18 22:26 Сейчас в теме
Делал что-то похожее, но с соответствиями. Структура не подошла из-за того, что клиенты задвинули экзотический тэг, который для ключа структуры не годится.
20. Infector 124 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С НОВОСИБИРСК
Новосибирск
зарплата до 130 000 руб.
Полный день

Программист 1С
Новосибирск
зарплата от 75 000 руб.
Полный день

Ведущий программист 1С
Воронеж
зарплата от 90 000 руб. до 120 000 руб.
Полный день

Программист 1С
Воронеж
зарплата от 65 000 руб. до 90 000 руб.
Полный день