Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить xml c xmlns / 8 сообщений из 8, страница 1 из 1
13.10.2016, 12:56
    #39326178
alex00_00
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
Здравствуйте, все перечитав, не могу найти подобного примера, помогите плз. Есть простой и немного странный xml
Код: xml
1.
2.
3.
4.
5.
<?xml version="1.0" encoding="utf-8"?>
    <answ>
      <res xmlns="http://tempuri.org/">0</res>
      <code xmlns="http://tempuri.org/">111</code>
    </answ>


нужно вытащить значения. Код на pl/sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
  vXML clob := '<?xml version="1.0" encoding="utf-8"?>
    <answ>
      <res xmlns="http://tempuri.org/">0</res>
      <code xmlns="http://tempuri.org/">111</code>
    </answ>';
  vRes number;
begin
  select res into vRes
  from xmltable(XmlNamespaces('http://tempuri.org' as "X"),
                '/answ'
               passing XMLType(vXML)
                columns
                res number path 'X:res') t;
  DBMS_OUTPUT.PUT_LINE('vRes = '||vRes);   
end; 


возвращает пустой результат vRes =
Хорошеет, если убрать xmlns=" http://tempuri.org/" из xml и XmlNamespaces соответственно, но это плохой вариант.
Как сделать красиво?
...
Рейтинг: 0 / 0
13.10.2016, 13:06
    #39326194
Leo Pevzner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
alex00_00,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
  vXML clob := '<?xml version="1.0" encoding="utf-8"?>
    <answ>
      <res xmlns="http://tempuri.org/">0</res>
      <code xmlns="http://tempuri.org/">111</code>
    </answ>';
  vRes number;
begin
  select res into vRes
  from xmltable(XmlNamespaces('http://tempuri.org' as "X"),
                '/answ'
               passing XMLType(vXML)
                columns
                res number path '/res') t;
  DBMS_OUTPUT.PUT_LINE('vRes = '||vRes);   
end; 
...
Рейтинг: 0 / 0
13.10.2016, 13:12
    #39326201
alex00_00
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
Leo Pevzner,
а у вас это работает? на 11-ой версии выдает пустое значение.
...
Рейтинг: 0 / 0
13.10.2016, 14:40
    #39326319
Leo Pevzner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
alex00_00,

Да. на 12 работает.
...
Рейтинг: 0 / 0
13.10.2016, 15:02
    #39326367
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
Leo PevznerДа. на 12 работает.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> declare
  2    vXML clob := '<?xml version="1.0" encoding="utf-8"?>
  3      <answ>
  4        <res xmlns="http://tempuri.org/">0</res>
  5        <code xmlns="http://tempuri.org/">111</code>
  6      </answ>';
  7    vRes number;
  8  begin
  9    select res into vRes
 10    from xmltable(XmlNamespaces('http://tempuri.org' as "X"),
 11                  '/answ'
 12                 passing XMLType(vXML)
 13                  columns
 14                  res number path '/res') t;
 15    DBMS_OUTPUT.PUT_LINE('vRes = '||vRes);
 16  end;
 17  /
vRes = 111

PL/SQL procedure successfully completed.

SQL>



Peзультат не смущает?

SY.
...
Рейтинг: 0 / 0
13.10.2016, 15:28
    #39326391
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
alex00_00возвращает пустой результат vRes =


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
declare
  vXML clob := '<?xml version="1.0" encoding="utf-8"?>
    <answ>
      <res xmlns="http://tempuri.org/">0</res>
      <code xmlns="http://tempuri.org/">111</code>
    </answ>';
  vRes number;
begin
  select res into vRes
  from xmltable('declare namespace e = "http://tempuri.org/";  (: :)
                 for $i in $d/answ/e:res
                 return $i'
               passing XMLType(vXML) as "d"
                 columns
                   res number path '.'
               ) t;
  DBMS_OUTPUT.PUT_LINE('vRes = '|| vRes);   
end;
/
vRes = 0

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
13.10.2016, 15:37
    #39326398
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
Ну а если нужны и res и code:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
declare
  vXML clob := '<?xml version="1.0" encoding="utf-8"?>
    <answ>
      <res xmlns="http://tempuri.org/">0</res>
      <code xmlns="http://tempuri.org/">111</code>
    </answ>';
  vRes number;
  vCode number;
begin
  select res,code into vRes,vCode
  from xmltable('declare namespace e = "http://tempuri.org/";  (: :)
                 let $i := $d/answ
                 return <x res="{$i/e:res}" code="{$i/e:code}"/>'
               passing XMLType(vXML) as "d"
                 columns
                   res number path '@res',
                   code number path '@code'
               ) t;
  DBMS_OUTPUT.PUT_LINE('vRes = '|| vRes);
  DBMS_OUTPUT.PUT_LINE('vCode = '|| vCode);
end;
/

vRes = 0
vCode = 111

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
14.10.2016, 07:51
    #39326746
alex00_00
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить xml c xmlns
SY,
благодарю!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить xml c xmlns / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]