Чтение значения атрибута узла XML или объекта XDTO

Позволяет произвести чтение значения атрибута узла/объекта xdto по имени, с помощью Фабрики XDTO. В конце пример использования. При чтении XML фабрикой XDTO во всех названиях узлов и свойств имеющих знак тире "-", платформа автоматически меняет тире на нижнее подчеркивание. Этот нюанс учтен в функции.

Функция ЗначениеСвойстваXDTO(ОбъектXDTO, Имя)

	ВариантИмени = СтрЗаменить(Имя, "-", "_");
	
	Значение = Неопределено;
	
	ИмяПоиска = Неопределено;
	
	Если ТипЗнч(ОбъектXDTO) = Тип("ОбъектXDTO") Тогда
		
		Свойства = ОбъектXDTO.Свойства();
		
		Для Каждого Свойство Из Свойства Цикл
			
			Если Врег(Свойство.Имя) = Врег(Имя) Тогда 
				
				ИмяПоиска = Имя;
				
				Прервать;
				
			ИначеЕсли Врег(Свойство.Имя) = Врег(ВариантИмени) Тогда
				
				ИмяПоиска = ВариантИмени;
				
				Прервать;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если ИмяПоиска <> Неопределено Тогда 
			
			Если ТипЗнч(ОбъектXDTO[ИмяПоиска]) = Тип("СписокXDTO") Тогда
				
				Значение = ОбъектXDTO.ПолучитьСписок(ИмяПоиска);
				
			Иначе
				
				Значение = ОбъектXDTO.ПолучитьXDTO(ИмяПоиска);
				
			КонецЕсли;
						
			Если ТипЗнч(Значение) = Тип("ЗначениеXDTO") Тогда
				
				Значение = Значение.Значение;
			
			КонецЕсли;
						
		КонецЕсли;
		
	ИначеЕсли ТипЗнч(ОбъектXDTO) = Тип("ЗначениеXDTO") Тогда
		
		Значение = ОбъектXDTO.Значение;
		
	КонецЕсли;

	
	Возврат Значение;

КонецФункции

// ИСПОЛЬЗОВАНИЕ
//
// На входе имеем XML. И нам нужно получить значение атрибута "message"

СтрокаXML = "
| <response>
| <payment message='Техническая ошибка'>
|  <from>
|    <amount>0.00</amount>
|  </from>
| </payment>
| </response>";

// Полный процесс получения будет выглядеть так

ЧтениеXML = Новый ЧтениеXML(); 
ЧтениеXML.УстановитьСтроку(СтрокаXML); 

Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

ЧтениеXML.Закрыть();

Платеж = ЗначениеСвойстваXDTO(Данные, "payment");

Если Платеж <> Неопределено Тогда
	
	Ошибка = ЗначениеСвойстваXDTO(Платеж, "message");  // Ошибка = "Техническая ошибка"

	Сообщить(Ошибка);

КонецЕсли;
1

Комментарии

nagaitseff
#1, 04 февраля 2021 05:32

Отличная функция, применил в разработке. Спасибо. Единственно, надо изменить строки, приведя их к верхнему регистру. Я столкнулся с этим.

Если ВРег(Свойство.Имя) = Врег(Имя) Тогда 
				
				ИмяПоиска = Имя;
				
				Прервать;
				
			ИначеЕсли Врег(Свойство.Имя) = Врег(ВариантИмени) Тогда
				
				ИмяПоиска = ВариантИмени;
				
				Прервать;
				
			КонецЕсли;


См. также

ПриЧтенииПредставленийНаСервере (БСП)

ПриЧтенииНаСервере (БСП)

ДополнитьПолучателей (БСП)

СократитьПолучателей (БСП)

Чтение XML в таблицу значений

ЕстьПравоЧтенияИнформацииОВерсияхОбъектов (БСП)

ЕстьПравоЧтенияДанныхВерсийОбъектов (БСП)

Чтение файла XML в объект XDTO

ЧтениеРазрешено (БСП)

Модератору