CftClub.ru
Клуб специалистов ЦФТ-Банк

Расстановка аттрибутов тега с помощью XML_DOM

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
СообщениеПн Dec 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. Но я могу ошибаться.


Жаль, спасибо за горькую правду Smile
Остается надеяться, что в следующих версиях ядра такая возможность появиться.
PS: {} - тоже не помогли, другие варианты вставок не известны...
vtar
Эксперт
Неподтвержденный


Вступление в Клуб: 20.03.2009
СообщениеЧт Июн 26, 2014 15:28    Ответить с цитатой
Полезность: Нет оценки
А если в фильтре представления завести pipelined функцию, а в представлении брать выборку из этой функции ?
GeorgiK
Участник со стажем
Сибирьгазбанк


Вступление в Клуб: 09.07.2008
СообщениеЧт Июн 26, 2014 15:41    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
А если в фильтре представления завести pipelined функцию, а в представлении брать выборку из этой функции ?


А может сам курсор в фильтре описать!? Надо проверить
Random
Эксперт
Резидент CftClub


Вступление в Клуб: 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. Но я могу ошибаться.


Жаль, спасибо за горькую правду Smile
Остается надеяться, что в следующих версиях ядра такая возможность появиться.
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 я предполагал дергать тоже из таблички вне схемы владельца Smile
А значит неудобства с администрированием, так что надо будет еще оценить стоит ли игра свеч...
Random
Эксперт
Резидент CftClub


Вступление в Клуб: 27.06.2011
СообщениеСр Июл 02, 2014 07:08    Ответить с цитатой
Полезность: Нет оценки
GeorgiK пишет:
Тоже вариант, но плюс еще объект вне системы доступа, т.к. сам xml я предполагал дергать тоже из таблички вне схемы владельца Smile
А значит неудобства с администрированием, так что надо будет еще оценить стоит ли игра свеч...


чё-то не понял.
данные из вьюшки читаются из операции, операция сделана под владельцем схемы, какие проблемы вьюшку тоже сделать под владельцем?
И прав на неё никаких раздавать не надо, потому что предназначена она только исключительно для использования внутри этой операции.

Ну или ещё вариант - сделать оракловский пакет для обработки всей задачи, а из операции вызывать процедуры/функции этого пакета.
GeorgiK
Участник со стажем
Сибирьгазбанк


Вступление в Клуб: 09.07.2008
СообщениеСр Июл 02, 2014 11:04    Ответить с цитатой
Полезность: Нет оценки
проблем нет, это просто мысли вслух про разграничение доступа...
И таблица для хранения xml создана, и пакет с функциями для обработки, и вьюшка(теперь уже тоже) и все это дергается из прикладной части. Не все еще оттестировано, но...это уже дело времени.
А за идею с вьюшкой спасибо, сам бы еще доходил какое то время...Smile
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru