powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить xml c xmlns
8 сообщений из 8, страница 1 из 1
распарсить xml c xmlns
    #39326178
alex00_00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, все перечитав, не могу найти подобного примера, помогите плз. Есть простой и немного странный 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
распарсить xml c xmlns
    #39326194
Leo Pevzner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
распарсить xml c xmlns
    #39326201
alex00_00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leo Pevzner,
а у вас это работает? на 11-ой версии выдает пустое значение.
...
Рейтинг: 0 / 0
распарсить xml c xmlns
    #39326319
Leo Pevzner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex00_00,

Да. на 12 работает.
...
Рейтинг: 0 / 0
распарсить xml c xmlns
    #39326367
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
распарсить xml c xmlns
    #39326391
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
распарсить xml c xmlns
    #39326398
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а если нужны и 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
распарсить xml c xmlns
    #39326746
alex00_00
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
благодарю!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить xml c xmlns
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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