Расстановка аттрибутов тега с помощью 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 создана, и пакет с функциями для обработки, и вьюшка(теперь уже тоже) и все это дергается из прикладной части. Не все еще оттестировано, но...это уже дело времени.
А за идею с вьюшкой спасибо, сам бы еще доходил какое то время... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|