Расстановка аттрибутов тега с помощью XML_DOM 
	   
	     | 
   
 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		Flame_of_Death Участник
 
  Вступление в Клуб: 17.04.2013
  | 
		
			
				 Чт Окт 10, 2013 06:35   Расстановка аттрибутов тега с помощью XML_DOM | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Добрый день! 
 
Подскажите, знающие люди. Формирую XML по стандарту документа (УФЭБС (КБР). Альбом.v2.5.9) с помощью библиотеки XML_DOM. Почему не работаю с библиотекой UFEBS_LIB_EXP, могу сказать сразу - тут специфическая ситуация, требующая выгрузки отдельно от РЦ. 
 
Формируем PacketEPD, там куча аттрибутов, типа EDNo, EDDate, EDAuthor  и т.д. После выгрузки документа теги расставляются след. образом: 
 
 	  | Код: | 	 		  | <PacketEPD EDAuthor="автор" EDDate="2013-09-19" EDNo="114" EDQuantity="1" EDReceiver="получатель" Sum="сумма" SystemCode="01" xmlns="urn:cbr-ru:ed:v2.0"> | 	  
 
а от нас требуют, чтобы атрибуты тега расставлялись в определённом порядке, что-то типа такого: 
 
 	  | Цитата: | 	 		  | <PacketEPD xmlns="urn:cbr-ru:ed:v2.0" EDNo="114" EDDate="2013-09-19" EDAuthor="автор" EDReceiver="получатель" EDQuantity="1"  Sum="сумма" SystemCode="01"> | 	  
 
Все атрибуты устанавливаются след. образом: 
 
 	  | Код: | 	 		  | &xml.setAttribute(EPD_elem, 'xmlns', 'urn:cbr-ru:ed:v2.0'); | 	  
 
где, &xml, это:
 
 	  | Код: | 	 		  | pragma macro(xml, '::[RUNTIME].[XML_DOM]'); | 	  
 
Может кто знает, что тут можно сделать? | 
			 
		  | 
	 
	
		  | 
	 
	
		Amper Профи
 
  Вступление в Клуб: 29.10.2010
  | 
		
			
				 Пт Окт 11, 2013 06:11    | 
				     | 
			 
			
				Полезность: 1 
  | 
			 
			
				ЦБР, видимо, придумали свой стандарт XML, где порядок атрибутов гарантирован. На ум приходит только что-то вроде (наброски):
 
 	  | Код: | 	 		     procedure sort_attrs_packet   
 
      ( p_in_xml    in varchar2(32767)
 
      , p_out_xml   out varchar2(32767)
 
      ) 
 
   is
 
   begin
 
      -- begin pl/sql
 
      select 
 
         XMLElement
 
            ( "PacketEPD"
 
            , XMLAttributes
 
               ( b.column_value.getNamespace() as "xmlns"
 
               , b.column_value.extract('//@EDNo').getStringVal() as "EDNo"
 
               , b.column_value.extract('//@EDDate').getStringVal() as "EDDate"
 
               , b.column_value.extract('//@EDAuthor').getStringVal() as "EDAuthor"
 
               , b.column_value.extract('//@EDReceiver').getStringVal() as "EDReceiver"
 
               , b.column_value.extract('//@EDQuantity').getStringVal() as "EDQuantity"
 
               , b.column_value.extract('//@Sum').getStringVal() as "Sum"
 
               , b.column_value.extract('//@SystemCode').getStringVal() as "SystemCode"
 
               )
 
            , b.column_value.extract('//node()/*')
 
            ).getStringVal()
 
      into p_out_xml
 
      from (select XMLType(p_in_xml) xml from DUAL) a
 
         , XMLTable('/*' passing a.xml) b;
 
      -- end pl/sql
 
   end;
 
 
   v_before varchar2(32767);
 
   v_after varchar2(32767);
 
begin
 
   v_before := '<PacketEPD EDAuthor="автор" EDDate="2013-09-19" EDNo="114" EDQuantity="1" EDReceiver="получатель" Sum="сумма" SystemCode="01" xmlns="urn:cbr-ru:ed:v2.0"></PacketEPD>';
 
   sort_attrs_packet(v_before, v_after);
 
   -- v_after = <PacketEPD xmlns="urn:cbr-ru:ed:v2.0" EDNo="114" EDDate="2013-09-19" EDAuthor="автор" EDReceiver="получатель" EDQuantity="1" Sum="сумма" SystemCode="01"></PacketEPD>
 
end;
 
 | 	  
 
Как вариант, вам можно попробовать воспользоваться ::[RUNTIME].[LXML] (если она подходит), судя по беглому просмотру кода, атрибуты в ней будут выведены в том порядке, в котором были установлены (но гарантировать не могу). | 
			 
		  | 
	 
	
		  | 
	 
	
		Flame_of_Death Участник
 
  Вступление в Клуб: 17.04.2013
  | 
		
			
				 Пн Дек 02, 2013 05:54    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Спасибо за совет. 
 
Задача оказалась не критичной для организации- приёмника файла. Они со своей стороны смогли нормально парсить файл. Но на досуге попробую. Ещё раз спасибо! | 
			 
		  | 
	 
	
		  | 
	 
	
		GeorgiK Участник со стажем
 
  Вступление в Клуб: 09.07.2008
  | 
		
			
				 Ср Июн 25, 2014 16:27    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Добрый день!
 
Идея разложить XML в селекте с помощью XMLTable показалась интересной.
 
Воплощение через PL/Sql в принципе не вызвало трудностей, благо доки и примеров в инете хватает.
 
Но переложить данный запрос в представление PL/Plus не получается.
 
Прагма pragma pl_sql(true) не дает желаемого эффекта, вставки "-- Begin pl/sql .. -- end pl/sql" как в операции невозможны.
 
Есть ли выход или это в принципе невозможно?
 
pl/sql:
 
 	  | Код: | 	 		  
 
select c.c_id Q_UID
 
       , b.column_value.extract('//UID/text()').getStringVal() r_uid1
 
       , b.column_value.extract('//UID2/text()').getStringVal() r_uid2
 
from (select 'XXXXXX' c_id
 
                ,XMLType('<REQUEST><HEADER><UID>111XXX</UID><UID2>222XXX</UID2></HEADER></REQUEST>') c_msg
 
      from DUAL) c
 
      , XMLTable('/*' passing c.c_msg) b;
 
 | 	  
 
pl/plus:
 
 	  | Код: | 	 		  
 
pragma pl_sql(true);
 
 
type cursor_ is
 
   select cl(c.c_id                  : Q_UID
 
           , b.column_value.extract('//UID/text()').getStringVal() : R_UID1
 
           , b.column_value.extract('//UID2/text()').getStringVal() : R_UID2
 
           )
 
     in (select c('XXXXXX'         : c_id
 
              , XMLType('<REQUEST><HEADER><UID>111XXX</UID><UID2>222XXX</UID2></HEADER></REQUEST>')   : c_msg
 
              )
 
        in DUAL%rowtype)
 
         , XMLTable('/*' passing c.c_msg) b;
 
 
type main is
 
select x(x.Q_UID               : Q_UID
 
        , x.R_UID               : R_UID
 
      )
 
   in cursor_;
 
 | 	  
 
 
При компиляции получаем синтаксическую ошибку с указанием (ст:стр) на XMLTable. | 
			 
		  | 
	 
	
		  | 
	 
	
		Amper Профи
 
  Вступление в Клуб: 29.10.2010
  | 
		
			
				 Чт Июн 26, 2014 03:28    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | GeorgiK пишет: | 	 		  Добрый день!
 
Идея разложить XML в селекте с помощью XMLTable показалась интересной.
 
Воплощение через PL/Sql в принципе не вызвало трудностей, благо доки и примеров в инете хватает.
 
Но переложить данный запрос в представление PL/Plus не получается.
 
Прагма pragma pl_sql(true) не дает желаемого эффекта, вставки "-- Begin pl/sql .. -- end pl/sql" как в операции невозможны.
 
Есть ли выход или это в принципе невозможно?
 
 | 	  
 
Насколько мне известно, это пока невозможно - XMLTable можно использовать либо через pl/sql-вставки, либо через execute immediate. Но я могу ошибаться. | 
			 
		  | 
	 
	
		  | 
	 
	
		GeorgiK Участник со стажем
 
  Вступление в Клуб: 09.07.2008
  | 
		
			
				 Чт Июн 26, 2014 13:09    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Amper пишет: | 	 		   	  | GeorgiK пишет: | 	 		  Добрый день!
 
Идея разложить XML в селекте с помощью XMLTable показалась интересной.
 
Воплощение через PL/Sql в принципе не вызвало трудностей, благо доки и примеров в инете хватает.
 
Но переложить данный запрос в представление PL/Plus не получается.
 
Прагма pragma pl_sql(true) не дает желаемого эффекта, вставки "-- Begin pl/sql .. -- end pl/sql" как в операции невозможны.
 
Есть ли выход или это в принципе невозможно?
 
 | 	  
 
Насколько мне известно, это пока невозможно - XMLTable можно использовать либо через pl/sql-вставки, либо через execute immediate. Но я могу ошибаться. | 	  
 
 
Жаль, спасибо за горькую правду  
 
Остается надеяться, что в следующих версиях ядра такая возможность появиться.
 
PS: {} - тоже не помогли, другие варианты вставок не известны... | 
			 
		  | 
	 
	
		  | 
	 
	
		vtar Эксперт
 
  Вступление в Клуб: 20.03.2009
  | 
		
			
				 Чт Июн 26, 2014 15:28    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| А если в фильтре представления завести pipelined функцию, а в представлении брать выборку из этой функции ? | 
			 
		  | 
	 
	
		  | 
	 
	
		GeorgiK Участник со стажем
 
  Вступление в Клуб: 09.07.2008
  | 
		
			
				 Чт Июн 26, 2014 15:41    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | vtar пишет: | 	 		  | А если в фильтре представления завести pipelined функцию, а в представлении брать выборку из этой функции ? | 	  
 
 
А может сам курсор в фильтре описать!? Надо проверить | 
			 
		  | 
	 
	
		  | 
	 
	
		Random Эксперт
 
  Вступление в Клуб: 27.06.2011
  | 
		
			
				 Пн Июн 30, 2014 09:18    | 
				     | 
			 
			
				Полезность: 1 
  | 
			 
			
				 	  | GeorgiK пишет: | 	 		   	  | Amper пишет: | 	 		   	  | GeorgiK пишет: | 	 		  Добрый день!
 
Идея разложить XML в селекте с помощью XMLTable показалась интересной.
 
Воплощение через PL/Sql в принципе не вызвало трудностей, благо доки и примеров в инете хватает.
 
Но переложить данный запрос в представление PL/Plus не получается.
 
Прагма pragma pl_sql(true) не дает желаемого эффекта, вставки "-- Begin pl/sql .. -- end pl/sql" как в операции невозможны.
 
Есть ли выход или это в принципе невозможно?
 
 | 	  
 
Насколько мне известно, это пока невозможно - XMLTable можно использовать либо через pl/sql-вставки, либо через execute immediate. Но я могу ошибаться. | 	  
 
 
Жаль, спасибо за горькую правду  
 
Остается надеяться, что в следующих версиях ядра такая возможность появиться.
 
PS: {} - тоже не помогли, другие варианты вставок не известны... | 	  
 
 
 	  | Код: | 	 		  
 
 
create view aaa as select c.c_id                  as Q_UID 
 
           , b.column_value.extract('//UID/text()').getStringVal() as R_UID1 
 
           , b.column_value.extract('//UID2/text()').getStringVal() as R_UID2 
 
          
 
     from (select 'XXXXXX'         as c_id 
 
              , XMLType('<REQUEST><HEADER><UID>111XXX</UID><UID2>222XXX</UID2></HEADER></REQUEST>')   as c_msg 
 
             
 
        from DUAL c) c
 
         , XMLTable('/*' passing c.c_msg) b
 
 
 | 	  
 
 
и в операции
 
 	  | Код: | 	 		  
 
type main is select a(a%rowtype) in aaa%rowtype;
 
 | 	  
 
 
Параметры можно передавать через контекст, например. | 
			 
		  | 
	 
	
		  | 
	 
	
		GeorgiK Участник со стажем
 
  Вступление в Клуб: 09.07.2008
  | 
		
			
				 Вт Июл 01, 2014 14:45    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Тоже вариант, но плюс еще объект вне системы доступа, т.к. сам xml я предполагал дергать тоже из таблички вне схемы владельца  
 
А значит неудобства с администрированием, так что надо будет еще оценить стоит ли игра свеч... | 
			 
		  | 
	 
	
		  | 
	 
	
		Random Эксперт
 
  Вступление в Клуб: 27.06.2011
  | 
		
			
				 Ср Июл 02, 2014 07:08    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | GeorgiK пишет: | 	 		  Тоже вариант, но плюс еще объект вне системы доступа, т.к. сам xml я предполагал дергать тоже из таблички вне схемы владельца  
 
А значит неудобства с администрированием, так что надо будет еще оценить стоит ли игра свеч... | 	  
 
 
чё-то не понял.
 
данные из вьюшки читаются из операции, операция сделана под владельцем схемы, какие проблемы вьюшку тоже сделать под владельцем?
 
И прав на неё никаких раздавать не надо, потому что предназначена она только исключительно для использования внутри этой операции.
 
 
Ну или ещё вариант - сделать оракловский пакет для обработки всей задачи, а из операции вызывать процедуры/функции этого пакета. | 
			 
		  | 
	 
	
		  | 
	 
	
		GeorgiK Участник со стажем
 
  Вступление в Клуб: 09.07.2008
  | 
		
			
				 Ср Июл 02, 2014 11:04    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				проблем нет, это просто мысли вслух про разграничение доступа...
 
И таблица для хранения xml создана, и пакет с функциями для обработки, и вьюшка(теперь уже тоже) и все это дергается из прикладной части. Не все еще оттестировано, но...это уже дело времени.
 
А за идею с вьюшкой спасибо, сам бы еще доходил какое то время...  | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |