powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
25 сообщений из 239, страница 8 из 10
XML в Oracle9i. Примеры разборки
    #38873416
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,

И еще, у тебя есть NS3:item и NS4:item. Через ось по направлению ты их одновременно не получишь, нужно ставить условие. Если мне не изменяет память тебе нужна xpath функция local_name() или както так....
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873424
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickroadster,

И еще, у тебя есть NS3:item и NS4:item. Через ось по направлению ты их одновременно не получишь, нужно ставить условие. Если мне не изменяет память тебе нужна xpath функция local_name() или както так....
Вспомнил, так:
Код: plsql
1.
2.
3.
select  extract(Value(p), '*/node()') 
      from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//*[local-name()="item"]'))) p
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873459
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

Код: plsql
1.
2.
3.
4.
select 
      cast(extract(Value(p), 'item/dF1 /text()', 'xmlns:x="http://www.test.ru/test/test/types/type1/v1"').getStringVal() as NUMBER) df_1
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p


так получается, но в значениях пусто...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873466
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickВспомнил, так:огромное спасибо, почти добил
Код: plsql
1.
2.
3.
4.
select 
      cast(extract(Value(p), 'dF1 /text()').getStringVal() as NUMBER) df_1
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*[local-name()="item"]/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p

так получает значения в итемах, но пустые.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873504
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

спасибочки огромное, сделано и заработало
кому интересно в спойлере (с кривым выводом, ну да мне просто проверить)
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
declare
 xRetClob clob;
 xRet varchar2(10);
 xRet1 varchar2(10);
 xRet2 varchar2(10);
 xRet3 varchar2(10);
 xRet4 varchar2(10);
 xRetXml XMLTYPE;
begin
  xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>';
  xRetXml := XMLTYPE(xRetClob);
  
  FOR cr_result IN
    (
     select 
      extractValue(Value(p), '/*[local-name()="staty"]') staty,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_1,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_2,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_3,
      extractValue(Value(p), '/*[local-name()="dF1"]') df_4
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*[local-name()="item"]/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p
    )
    LOOP    
      xRet := cr_result.staty;
      dbms_output.put_line(xRet);
      xRet1 := cr_result.df_1;
      dbms_output.put_line(xRet1);
      xRet2 := cr_result.df_2;
      dbms_output.put_line(xRet2);
      xRet3 := cr_result.df_3;
      dbms_output.put_line(xRet3);
      xRet4 := cr_result.df_4;
      dbms_output.put_line(xRet4);
    END LOOP;
exception
  when others then dbms_output.put_line(SQLERRM);
end;

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873532
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
WITH t AS (
           SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>') xRetXml
             FROM  DUAL
          )
SELECT  staty,
        df_1,
        df_2,
        df_3,
        df_4
  FROM  t,
        XMLTABLE(
                 XMLNAMESPACES(
                               'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                               'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS2",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS3",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS4"
                              ),
                 '/soapenv:Envelope/soapenv:Body/NS1:getData/response/NS4:item'
                 PASSING xRetXml
                 COLUMNS
                   staty NUMBER PATH 'NS4:staty',
                   df_1  NUMBER PATH 'NS4:dF1',
                   df_2  NUMBER PATH 'NS4:dF2',
                   df_3  NUMBER PATH 'NS4:dF3',
                   df_4  NUMBER PATH 'NS4:dF4'
                )
/

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1000          0          0          0          0
      1100          0          0          0          0

SQL> 



Почему возвращает две строки? NS3 и NS4 namespaces идентичны. Если изменить NS4 на http://www.test.ru/test/test/types/type1/v2 то мое решение вернет именно NS4:item а вот решение от ArtNick/roadster все равно вернет все item этого уровня независимо от namespace:

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
SQL> WITH t AS (
  2             SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/en
velope/">
  3     <soapenv:Body>
  4        <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
  5           <response>
  6              <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
  7                 <NS2:statusCode>0</NS2:statusCode>
  8                 <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
  9              </NS2:status>
 10              <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
 11                 <NS3:staty>1000</NS3:staty>
 12                 <NS3:dF1>0.00</NS3:dF1>
 13                 <NS3:dF2>0.00</NS3:dF2>
 14                 <NS3:dF3>0.00</NS3:dF3>
 15                 <NS3:dF4>0.00</NS3:dF4>
 16              </NS3:item>
 17              <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v2">
 18                 <NS4:staty>1100</NS4:staty>
 19                 <NS4:dF1>0.00</NS4:dF1>
 20                 <NS4:dF2>0.00</NS4:dF2>
 21                 <NS4:dF3>0.00</NS4:dF3>
 22                 <NS4:dF4>0.00</NS4:dF4>
 23              </NS4:item>
 24           </response>
 25        </NS1:getData>
 26     </soapenv:Body>
 27  </soapenv:Envelope>') xRetXml
 28               FROM  DUAL
 29            )
 30  SELECT  staty,
 31          df_1,
 32          df_2,
 33          df_3,
 34          df_4
 35    FROM  t,
 36          XMLTABLE(
 37                   XMLNAMESPACES(
 38                                 'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
 39                                 'http://www.test.ru/test/test/service/service1/v1' as "NS1",
 40                                 'http://www.test.ru/test/test/types/type1/v1' as "NS2",
 41                                 'http://www.test.ru/test/test/types/type1/v1' as "NS3",
 42                                 'http://www.test.ru/test/test/types/type1/v2' as "NS4"
 43                                ),
 44                   '/soapenv:Envelope/soapenv:Body/NS1:getData/response/NS4:item'
 45                   PASSING xRetXml
 46                   COLUMNS
 47                     staty NUMBER PATH 'NS4:staty',
 48                     df_1  NUMBER PATH 'NS4:dF1',
 49                     df_2  NUMBER PATH 'NS4:dF2',
 50                     df_3  NUMBER PATH 'NS4:dF3',
 51                     df_4  NUMBER PATH 'NS4:dF4'
 52                  )
 53  /

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1100          0          0          0          0

SQL> declare
  2   xRetClob clob;
  3   xRet varchar2(10);
  4   xRet1 varchar2(10);
  5   xRet2 varchar2(10);
  6   xRet3 varchar2(10);
  7   xRet4 varchar2(10);
  8   xRetXml XMLTYPE;
  9  begin
 10    xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 11     <soapenv:Body>
 12        <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
 13           <response>
 14              <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
 15                 <NS2:statusCode>0</NS2:statusCode>
 16                 <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
 17              </NS2:status>
 18              <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
 19                 <NS3:staty>1000</NS3:staty>
 20                 <NS3:dF1>0.00</NS3:dF1>
 21                 <NS3:dF2>0.00</NS3:dF2>
 22                 <NS3:dF3>0.00</NS3:dF3>
 23                 <NS3:dF4>0.00</NS3:dF4>
 24              </NS3:item>
 25              <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v2">
 26                 <NS4:staty>1100</NS4:staty>
 27                 <NS4:dF1>0.00</NS4:dF1>
 28                 <NS4:dF2>0.00</NS4:dF2>
 29                 <NS4:dF3>0.00</NS4:dF3>
 30                 <NS4:dF4>0.00</NS4:dF4>
 31              </NS4:item>
 32           </response>
 33        </NS1:getData>
 34     </soapenv:Body>
 35  </soapenv:Envelope>';
 36    xRetXml := XMLTYPE(xRetClob);
 37  
 38    FOR cr_result IN
 39      (
 40       select
 41        extractValue(Value(p), '/*[local-name()="staty"]') staty,
 42        extractValue(Value(p), '/*[local-name()="dF1"]') df_1,
 43        extractValue(Value(p), '/*[local-name()="dF1"]') df_2,
 44        extractValue(Value(p), '/*[local-name()="dF1"]') df_3,
 45        extractValue(Value(p), '/*[local-name()="dF1"]') df_4
 46       from
 47       Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*[local-name()="ite
m"]/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/tes
t/test/service/service1/v1"'))) p
 48      )
 49      LOOP
 50        xRet := cr_result.staty;
 51        dbms_output.put_line(xRet);
 52        xRet1 := cr_result.df_1;
 53        dbms_output.put_line(xRet1);
 54        xRet2 := cr_result.df_2;
 55        dbms_output.put_line(xRet2);
 56        xRet3 := cr_result.df_3;
 57        dbms_output.put_line(xRet3);
 58        xRet4 := cr_result.df_4;
 59        dbms_output.put_line(xRet4);
 60      END LOOP;
 61  exception
 62    when others then dbms_output.put_line(SQLERRM);
 63  end;
 64  /
1000
0.00
0.00
0.00
0.00
1100
0.00
0.00
0.00
0.00

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873541
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYа вот решение от ArtNick/roadster все равно вернет все item этого уровня независимо от namespace:да, именно это мне и надо.
не я формирую ответ, набор итемов может быть достаточно большой (на тестовом ответе их 64, но это не предел, другой сервис вернул 4642 итема с другой структурой), мне надо их разобрать и положить в таблицу.
но это конкретно мой случай.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873546
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

и неймспейсы не меняются для итемов.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873580
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправил, чтобы не 10 строк выводилось
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
declare
 xRetClob clob;
 xRet varchar2(10);
 xRet1 varchar2(10);
 xRet2 varchar2(10);
 xRet3 varchar2(10);
 xRet4 varchar2(10);
 l_rn NUMBER;
 xRetXml XMLTYPE;
begin
  xRetClob := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>1.00</NS3:dF2>
               <NS3:dF3>2.00</NS3:dF3>
               <NS3:dF4>3.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>4.00</NS4:dF1>
               <NS4:dF2>5.00</NS4:dF2>
               <NS4:dF3>6.00</NS4:dF3>
               <NS4:dF4>7.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>';
  xRetXml := XMLTYPE(xRetClob);
  
  FOR cr_result IN
    (
     select rownum as rn, 
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="staty"] /text()') staty,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF1"] /text()') df_1,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF2"] /text()') df_2,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF3"] /text()') df_3,
      extractValue(Value(p), '/*[local-name()="item"]/*[local-name()="dF4"] /text()') df_4
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/response/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1"'))) p
    )
    LOOP
      l_rn := cr_result.rn;
      IF cr_result.staty IS NOT NULL THEN xRet := cr_result.staty; END IF;
      IF cr_result.df_1 IS NOT NULL THEN xRet1 := cr_result.df_1; END IF;
      IF cr_result.df_2 IS NOT NULL THEN xRet2 := cr_result.df_2; END IF;
      IF cr_result.df_3 IS NOT NULL THEN xRet3 := cr_result.df_3; END IF;
      IF cr_result.df_4 IS NOT NULL THEN xRet4 := cr_result.df_4; END IF;
      --IF MOD(l_rn, 5) = 0 THEN
        dbms_output.put_line(l_rn || ' staty=' || xRet || '; dF1=' || xRet1 || '; dF2=' ||xRet2 || '; dF3=' ||xRet3 || '; dF4=' ||xRet4);
     -- END IF;
    END LOOP;
exception
  when others then dbms_output.put_line(SQLERRM);
end;

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873711
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
я тоже подобные запросы пишу только через XMLTABLE, но автор пишет о 9 версии. Вроде XMLTABLE c 10-й?
И еще на эту тему. Пару лет назад был проект с большим объемом парсинга XML, при это сами документы были с кучей ns, и что самое противное они постоянно менялись. То есть могли одновременно приходить как xmlns:NS3=" http://www.test.ru/test/test/types/type1/v1 так и xmlns:NS3=" http://www.test.ru/test/test/types/type1/v2 и т.д. Дабы не увязать в сопровождении я сделал так:
1. Трансформировал XML в простую структуру без ns посредством XQUERY, там можно прочитать ns в переменную и дальше юзать переменную
2. Парсил простую XML

У меня были сомнения в части веса такого подхода, все таки скриптовый язык, но, к удивлению, они исчезли после тестов.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874588
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

у меня 11 версия, но
ArtNickсами документы были с кучей ns, и что самое противное они постоянно менялись. То есть могли одновременно приходить как xmlns:NS3=" http://www.test.ru/test/test/types/type1/v1 так и xmlns:NS3=" http://www.test.ru/test/test/types/type1/v2 и т.д.у меня то же самое.
вариант с простой XML я рассмотрю, спасибо.
ЗЫ тему поднял, дабы не плодить.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874822
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
roadsterArtNick,

у меня 11 версия, но
ArtNickсами документы были с кучей ns, и что самое противное они постоянно менялись. То есть могли одновременно приходить как xmlns:NS3=" http://www.test.ru/test/test/types/type1/v1 так и xmlns:NS3=" http://www.test.ru/test/test/types/type1/v2 и т.д.у меня то же самое.
вариант с простой XML я рассмотрю, спасибо.
ЗЫ тему поднял, дабы не плодить.
разбор твоего XML с разными неймспейсами через wildcards:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t
/

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874825
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
чуть проще:
Код: plsql
1.
for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item return $r


Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item return $r'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t
/


по идее вообще должно было бы хватить:
Код: plsql
1.
/soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item


но почему-то не работает(может глаза замылились и чего-то не замечаю),
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874841
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
судя по-всему просто очередной баг, т.к. при изменении типа столбцов в "columns" на xmltype все работает как надо:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select--+ NO_XML_QUERY_REWRITE
       v.xval
      ,xmlcast(df_1 as varchar2(10)) df1
      ,xmlcast(df_2 as varchar2(10)) df2
      ,xmlcast(df_3 as varchar2(10)) df3
      ,xmlcast(df_4 as varchar2(10)) df4
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              '/soapenv:Envelope/soapenv:Body/xmlns1:getData/response/*:item'
              passing xmltype(v.xval)
              columns 
                  x xmltype path '.'
                 ,df_1 xmltype path './*:dF1'
                 ,df_2 xmltype path './*:dF2'
                 ,df_3 xmltype path './*:dF3'
                 ,df_4 xmltype path './*:dF4'
            ) t
/

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874854
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderпо идее вообще должно было бы хватить:


Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
WITH t AS (
           SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>') xRetXml
             FROM  DUAL
          )
SELECT  staty,
        df_1,
        df_2,
        df_3,
        df_4
  FROM  t,
        XMLTABLE(
                 XMLNAMESPACES(
                               'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                               'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS2",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS3",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS4"
                              ),
                 '/soapenv:Envelope/soapenv:Body/NS1:getData/response/*:item'
                 PASSING xRetXml
                 COLUMNS
                   staty NUMBER PATH '*:staty',
                   df_1  NUMBER PATH '*:dF1',
                   df_2  NUMBER PATH '*:dF2',
                   df_3  NUMBER PATH '*:dF3',
                   df_4  NUMBER PATH '*:dF4'
                )
/

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1000          0          0          0          0
      1100          0          0          0          0

SQL> 



SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874863
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderразбор твоего XML с разными неймспейсами через wildcards:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/xmlns1:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t
/


Ты перечисляешь ns.Когда враги начнут http://www.test.ru/test/test/types/type1/v348 передавать придется придется скрипт менять, а лень. Я же имел в виду внутри xquery прочитать в переменные. И еще такая чисто субъективная привычка, для XMLTABLE () использую xpath а для XQUERY() - xquery....
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874888
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ArtNickТы перечисляешь ns.Когда враги начнут http://www.test.ru/test/test/types/type1/v348 передавать придется придется скрипт менять, а лень. Я же имел в виду внутри xquery прочитать в переменные. И еще такая чисто субъективная привычка, для XMLTABLE () использую xpath а для XQUERY() - xquery....бред-бред-бред...
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
--                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
--                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/*:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874941
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderArtNickТы перечисляешь ns.Когда враги начнут http://www.test.ru/test/test/types/type1/v348 передавать придется придется скрипт менять, а лень. Я же имел в виду внутри xquery прочитать в переменные. И еще такая чисто субъективная привычка, для XMLTABLE () использую xpath а для XQUERY() - xquery....бред-бред-бред...
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select v.xval
      ,t.*
from v
    ,xmltable( xmlnamespaces('http://schemas.xmlsoap.org/soap/envelope/'        as "soapenv"
--                            ,'http://www.test.ru/test/test/service/service1/v1' as "xmlns1"
--                            ,'http://www.test.ru/test/test/types/type1/v'       as "xmlns2"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns3"
--                            ,'http://www.test.ru/test/test/types/type1/v1'      as "xmlns4"
                            ),
              'for $r in /soapenv:Envelope/soapenv:Body/*:getData/response
                  return $r/*:item'
              passing xmltype(v.xval)
              columns 
                  df_1 varchar2(10) path '*:dF1'
                 ,df_2 varchar2(10) path '*:dF2'
                 ,df_3 varchar2(10) path '*:dF3'
                 ,df_4 varchar2(10) path '*:dF4'
            ) t


Ересь! Извлекать все подряд документы item это кто ж тебя такому учил. Если уж пишешь так хоть голову включай а не опу
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874969
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ArtNickИзвлекать все подряд документы itemа подумать?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874976
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SYxtenderпо идее вообще должно было бы хватить:


Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
WITH t AS (
           SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
         <response>
            <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
               <NS2:statusCode>0</NS2:statusCode>
               <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
            </NS2:status>
            <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
               <NS3:staty>1000</NS3:staty>
               <NS3:dF1>0.00</NS3:dF1>
               <NS3:dF2>0.00</NS3:dF2>
               <NS3:dF3>0.00</NS3:dF3>
               <NS3:dF4>0.00</NS3:dF4>
            </NS3:item>
            <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
               <NS4:staty>1100</NS4:staty>
               <NS4:dF1>0.00</NS4:dF1>
               <NS4:dF2>0.00</NS4:dF2>
               <NS4:dF3>0.00</NS4:dF3>
               <NS4:dF4>0.00</NS4:dF4>
            </NS4:item>
         </response>
      </NS1:getData>
   </soapenv:Body>
</soapenv:Envelope>') xRetXml
             FROM  DUAL
          )
SELECT  staty,
        df_1,
        df_2,
        df_3,
        df_4
  FROM  t,
        XMLTABLE(
                 XMLNAMESPACES(
                               'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
                               'http://www.test.ru/test/test/service/service1/v1' as "NS1",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS2",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS3",
                               'http://www.test.ru/test/test/types/type1/v1' as "NS4"
                              ),
                 '/soapenv:Envelope/soapenv:Body/NS1:getData/response/*:item'
                 PASSING xRetXml
                 COLUMNS
                   staty NUMBER PATH '*:staty',
                   df_1  NUMBER PATH '*:dF1',
                   df_2  NUMBER PATH '*:dF2',
                   df_3  NUMBER PATH '*:dF3',
                   df_4  NUMBER PATH '*:dF4'
                )
/

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
      1000          0          0          0          0
      1100          0          0          0          0

SQL> 




SY.а какая версия?
у меня на 11.2.0.3.11:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
SQL> set null -null-;
SQL> WITH t AS (
  2             SELECT  XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  3     <soapenv:Body>
  4        <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
  5           <response>
  6              <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
  7                 <NS2:statusCode>0</NS2:statusCode>
  8                 <NS2:statusDesc>???????? ?????????? ????????</NS2:statusDesc>
  9              </NS2:status>
 10              <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
 11                 <NS3:staty>1000</NS3:staty>
 12                 <NS3:dF1>0.00</NS3:dF1>
 13                 <NS3:dF2>0.00</NS3:dF2>
 14                 <NS3:dF3>0.00</NS3:dF3>
 15                 <NS3:dF4>0.00</NS3:dF4>
 16              </NS3:item>
 17              <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
 18                 <NS4:staty>1100</NS4:staty>
 19                 <NS4:dF1>0.00</NS4:dF1>
 20                 <NS4:dF2>0.00</NS4:dF2>
 21                 <NS4:dF3>0.00</NS4:dF3>
 22                 <NS4:dF4>0.00</NS4:dF4>
 23              </NS4:item>
 24           </response>
 25        </NS1:getData>
 26     </soapenv:Body>
 27  </soapenv:Envelope>') xRetXml
 28               FROM  DUAL
 29            )
 30  SELECT  staty,
 31          df_1,
 32          df_2,
 33          df_3,
 34          df_4
 35    FROM  t,
 36          XMLTABLE(
 37                   XMLNAMESPACES(
 38                                 'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
 39                                 'http://www.test.ru/test/test/service/service1/v1' as "NS1",
 40                                 'http://www.test.ru/test/test/types/type1/v1' as "NS2",
 41                                 'http://www.test.ru/test/test/types/type1/v1' as "NS3",
 42                                 'http://www.test.ru/test/test/types/type1/v1' as "NS4"
 43                                ),
 44                   '/soapenv:Envelope/soapenv:Body/NS1:getData/response/*:item'
 45                   PASSING xRetXml
 46                   COLUMNS
 47                     staty NUMBER PATH '*:staty',
 48                     df_1  NUMBER PATH '*:dF1',
 49                     df_2  NUMBER PATH '*:dF2',
 50                     df_3  NUMBER PATH '*:dF3',
 51                     df_4  NUMBER PATH '*:dF4'
 52                  )
 53  /

     STATY       DF_1       DF_2       DF_3       DF_4
---------- ---------- ---------- ---------- ----------
-null-     -null-     -null-     -null-     -null-
-null-     -null-     -null-     -null-     -null-

2 rows selected.

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874977
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderArtNickИзвлекать все подряд документы itemа подумать?
Вот это я тебе и предложил! Не извлекать все item из документа а тольком NS3:item и NS4:item иначе рискуеш JOPA:item получить. При это вне зависимости от версии схемы, в которой элементы объявлены
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874979
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNickЕресь! Извлекать все подряд документы item это кто ж тебя такому учил. Если уж пишешь так хоть голову включай а не опу

Не документы, а узлы документa (nodes). И не все, а только на ветке /soapenv:Envelope/soapenv:Body/NS1:getData/response. Ну и самое главное - а что твое решешие не извлекает все items на ветке?

SY.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874981
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

спасибо, возьму на заметку.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38874987
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYArtNickЕресь! Извлекать все подряд документы item это кто ж тебя такому учил. Если уж пишешь так хоть голову включай а не опу

Не документы, а узлы документa (nodes). И не все, а только на ветке /soapenv:Envelope/soapenv:Body/NS1:getData/response. Ну и самое главное - а что твое решешие не извлекает все items на ветке?

SY.

Не узлы а элементы, рас уж ратуешь за правильную терминологию то пользуйся стандартной.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38875039
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYПочему возвращает две строки? NS3 и NS4 namespaces идентичны. Если изменить NS4 на http://www.test.ru/test/test/types/type1/v2 то мое решение вернет именно NS4:item а вот решение от ArtNick/roadster все равно вернет все item этого уровня независимо от namespace:
SY.
Об этом и говорили выше.
Менять же документ на стоит, он такой какой есть.
Парсить его лучше так:
1. объявить ns, их 3.
3. парсить по объявленным ns
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
declare
 cd xmltype;
begin
with v as (
         select 
         '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <NS1:getData xmlns:NS1="http://www.test.ru/test/test/service/service1/v1">
                  <response>
                     <NS2:status xmlns:NS2="http://www.test.ru/test/test/types/type1/v1">
                        <NS2:statusCode>0</NS2:statusCode>
                        <NS2:statusDesc>Успешное выполнение операции</NS2:statusDesc>
                     </NS2:status>
                     <NS3:item xmlns:NS3="http://www.test.ru/test/test/types/type1/v1">
                        <NS3:staty>1000</NS3:staty>
                        <NS3:dF1>0.00</NS3:dF1>
                        <NS3:dF2>0.00</NS3:dF2>
                        <NS3:dF3>0.00</NS3:dF3>
                        <NS3:dF4>0.00</NS3:dF4>
                     </NS3:item>
                     <NS4:item xmlns:NS4="http://www.test.ru/test/test/types/type1/v1">
                        <NS4:staty>1100</NS4:staty>
                        <NS4:dF1>1.00</NS4:dF1>
                        <NS4:dF2>2.00</NS4:dF2>
                        <NS4:dF3>3.00</NS4:dF3>
                        <NS4:dF4>4.00</NS4:dF4>
                     </NS4:item>
                  </response>
               </NS1:getData>
            </soapenv:Body>
         </soapenv:Envelope>' as xval
         from dual
)
select xmltype(v.xval) into cd from v;
open :the_cursor for
 select xmlquery (' declare namespace service ="http://www.test.ru/test/test/service/service1/v1";
                    declare namespace type ="http://www.test.ru/test/test/types/type1/v1";
                    declare namespace soapenv ="http://schemas.xmlsoap.org/soap/envelope/";
                    <AllData>
                    {
                    for $i in  soapenv:Envelope/soapenv:Body/service:getData/response/type:item
                    return 
                        <Item dF1="{$i/type:dF1/text()}" dF2="{$i/type:dF2/text()}" dF3="{$i/type:dF3/text()}" dF4="{$i/type:dF4/text()}"/>
                    }                    
                    </AllData>
 '                    
                  passing cd
                  returning content) from dual;
end;


и тогда хоть NS3, NS4, NS248 -
...
Рейтинг: 0 / 0
25 сообщений из 239, страница 8 из 10
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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