Преобразование 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 1103 11.10.18 11:55 Сейчас в теме
(10) Фабрика привязана к набору и типам данных. А стартер, очевидно, хочет преобразовывать произвольные структуры.
12. ZMGMSC 73 11.10.18 11:57 Сейчас в теме
http://schemas.xmlsoap.org/soap/envelope/">
с такой шляпой и типы о клиента могут быть свои
13. dusha0020 1103 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 199 12.10.18 22:26 Сейчас в теме
Делал что-то похожее, но с соответствиями. Структура не подошла из-за того, что клиенты задвинули экзотический тэг, который для ключа структуры не годится.
20. Infector 199 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
Сообщение было скрыто модератором.
...
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

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

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

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день