Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вызов SOAP метода с аргументом типа XML  [new]
_PLSQL_
Guest
Вызываю из процедуры SOAP метод, одним из аргументов которого является строка, содержащая XML. Соответственно мне необходимо предварительно выполнить преобразование этой строки, чтобы исключить служебные символы XML. Сейчас пока я делаю это replace'ом
      
      v_sArg0:=cl.data;
      v_sArg0:=replace(v_sArg0,'&','&');
      v_sArg0:=replace(v_sArg0,'<','<');
      v_sArg0:=replace(v_sArg0,'>','>');
      v_sArg0:=replace(v_sArg0,'"','"');
      v_sArg0:=replace(v_sArg0,'''',''');
Может уважаемый ALL знает некую стандартную функцию, которая может выполнить такое преобразование?

PS
v_sArgs0 имеет тип CLOB
10 авг 11, 12:45    [11096923]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
-2-
Member

Откуда:
Сообщений: 15330
_PLSQL_,

CDATA?
10 авг 11, 12:59    [11097080]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
_PLSQL_,

select dbms_xmlgen.convert('<name>&</name>') from dual;
10 авг 11, 13:25    [11097363]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
publexus
Member

Откуда: Москва
Сообщений: 955
publexus
_PLSQL_,

select dbms_xmlgen.convert('<name>&</name>') from dual;

и обратно
dbms_xmlgen.convert(txt,1)
10 авг 11, 13:28    [11097402]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
_PLSQL_
Guest
publexus,
Спасибо. Это как раз то, что я и искал.

-2-,
c CDATA у меня не пошло. Возможно, что я неправильно использовал.
10 авг 11, 13:29    [11097423]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
-2-
Member

Откуда:
Сообщений: 15330
_PLSQL_
c CDATA у меня не пошло. Возможно, что я неправильно использовал.
w3.org
Within a CDATA section, only the CDEnd string is recognized as markup, so that left angle brackets and ampersands may occur in their literal form; they need not (and cannot) be escaped using " < " and " & ". CDATA sections cannot nest.

An example of a CDATA section, in which " <greeting> " and " </greeting> " are recognized as character data, not markup:
<![CDATA[<greeting>Hello, world!</greeting>]]>
10 авг 11, 13:35    [11097484]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
-2-
Member

Откуда:
Сообщений: 15330
set scan off
select xmlcdata('<a>123456</a>') from dual;

XMLCDATA('<A>123456</A>') 
--------------------------
<![CDATA[<a>123456</a>]]> 
10 авг 11, 13:39    [11097519]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
_PLSQL_
Guest
-2-,
Заработало.Получается неправильно использовал.
Спасибо.

Думаю, что мне предпочтительней вариант с CDATA. В этом случае снимается с БД нагрузка по конвертации XML. Верно?
10 авг 11, 15:46    [11098714]     Ответить | Цитировать Сообщить модератору
 Re: Вызов SOAP метода с аргументом типа XML  [new]
-2-
Member

Откуда:
Сообщений: 15330
_PLSQL_
В этом случае снимается с БД нагрузка по конвертации XML. Верно?
Чтобы избежать своих ошибок, лучше не клеить строки, а формировать xml как xmltype и в общем-то он сам разруливает эскейпинг специальных символов. Но доверять целиком ораклу нельзя. Один и тот же запрос может выдавать разный результат, в зависимости от того, как что выкинет xml-оптимизатор при хардпарсе
SQL> set linesize 200
SQL> set long 1000
SQL> set null '{нуль}'
SQL> col x format a50
SQL> col y format a25
SQL> col z format a25
SQL>
SQL> alter session set events ='19027 trace name context off';

Session altered.

SQL> alter system flush shared_pool;

System altered.

SQL>
SQL> with t as (
  2     select xmlroot(xmlelement("x", xmlforest('<ydata>123</ydata>' "y", xmlcdata('<zdata>строка</zdata>') "z")), version '1.0') x from dual
  3  )
  4  select
  5     extractvalue(x, '/x/y') y,
  6     extractvalue(x, '/x/z/text()') z,
  7     x
  8  from t;

Y                         Z                         X
------------------------- ------------------------- --------------------------------------------------
<ydata>123</ydata>        {нуль}                    <?xml version="1.0"?>
                                                    <x>
                                                      <y><ydata>123</ydata></y>
                                                      <z><![CDATA[<zdata>строка</zdata>]]></z>
                                                    </x>


SQL>
SQL> alter session set events ='19027 trace name context forever, level 0x1';

Session altered.

SQL> alter system flush shared_pool;

System altered.

SQL>
SQL> with t as (
  2     select xmlroot(xmlelement("x", xmlforest('<ydata>123</ydata>' "y", xmlcdata('<zdata>строка</zdata>') "z")), version '1.0') x from dual
  3  )
  4  select
  5     extractvalue(x, '/x/y') y,
  6     extractvalue(x, '/x/z/text()') z,
  7     x
  8  from t;

Y                         Z                         X
------------------------- ------------------------- --------------------------------------------------
<ydata>123</ydata>        <zdata>строка</zdata>     <?xml version="1.0"?>
                                                    <x>
                                                      <y><ydata>123</ydata></y>
                                                      <z><![CDATA[<zdata>строка</zdata>]]></z>
                                                    </x>

10 авг 11, 18:47    [11100155]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить