powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
25 сообщений из 239, страница 7 из 10
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #36524738
Zloxaоно?
Код: plaintext
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.
SQL> select XmlType (
   2   '<ApplicationFile>
  3  <ttt>
  4  <ggg>234</ggg>
  5  <no_text><no_text></no_text></no_text>
  6  </ttt>
  7  <no_text></no_text>
  8  <ttt>111</ttt>
  9  </ApplicationFile>
 10  '
  11          ).transform (
  12            XmlType (
  13   '<?xml version="1.0"?>
 14  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 15    <xsl:template match="*">
 16      <xsl:element name="{local-name()}">
 17        <xsl:call-template name="rec"/>
 18      </xsl:element>
 19    </xsl:template>
 20    <xsl:template name="rec">
 21       <xsl:for-each select="child::node()">
 22          <xsl:if test=".//text()">
 23            <xsl:copy>
 24              <xsl:value-of select="text()"/>
 25              <xsl:call-template name="rec"/>
 26            </xsl:copy>
 27          </xsl:if>
 28       </xsl:for-each>
 29    </xsl:template>
 30  </xsl:stylesheet>'
  31            )
  32          ).getStringVal() no_empty_element
  33   from DUAL;
 
NO_EMPTY_ELEMENT
--------------------------------------------------------------------------------
<ApplicationFile>
  <ttt>
    <ggg> 234 </ggg>
  </ttt>
  <ttt> 111 </ttt>
</ApplicationFile>
 


Если у тега есть атрибуты, то данное преобразование их удаляет. Возможно это как то решить на 9-ке?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #36524758
Извиняюсь, поясню - приведенное выше преобразование XML удаляет пустые теги. Но, как выяснилось, удаляет также атрибуты тегов, если они присутствуют. Вот и хотелось бы узнать, как проще всего сделать так, чтобы они оставались.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #38388933
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Без вас не разберусь, но очень хочется. Пошли вторые сутки как я не могу распарсить простенький xml с использованием пакета XMLDOM и постов на этом замечательно форуме. Многое прочитано и осознано, но тщетно. Без обращения к светилам не обойтись. Прошу вас не пройти мимо и помочь. Вам понравиться. =)
Вот мой(ваш) ‘код’:
Код: 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.
declare 

   v_doc            xmldom.domdocument;
   
   
   v_list_person    xmldom.domnodelist;
   v_element_person   xmldom.domelement;
   
   
   
   
   v_list_name      xmldom.domnodelist;
   v_element_name   xmldom.domelement;
   v_first_name     VARCHAR2(100);
   v_second_name    VARCHAR2(100);
   v_last_name      VARCHAR2(100);
   v_dob            DATE;
   
   v_list_passport  xmldom.domnodelist;
   v_element_passport xmldom.domelement;
   v_sernum         VARCHAR2(100);
   v_doc_date       VARCHAR2(100);
   
   
   p_xml clob;

begin 
   
  p_xml := XMLTYPE(
 '<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991"/>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report>
').getclobval();

  v_doc := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname (v_doc, 'Person');
  
  
  
  
  FOR i IN 0 .. xmldom.getlength (v_list_person) - 1
  loop
        
       v_list_name := xmldom.getelementsbytagname (v_doc, 'Name');
       
              FOR i IN 0 .. xmldom.getlength (v_list_name) - 1
               LOOP
                  v_element_name := xmldom.makeelement (xmldom.item (v_list_name, i));
                  v_first_name := xmldom.getattribute (v_element_name, 'n');
                  v_second_name := xmldom.getattribute (v_element_name, 'm');
                  v_last_name := xmldom.getattribute (v_element_name, 's');
                  v_dob := xmldom.getattribute (v_element_name, 'd'); 
                  
                 DBMS_OUTPUT.PUT_LINE(v_last_name ||'  '|| v_first_name ||' '||  v_second_name  ||' '||  v_dob);
                 
                    v_list_passport  := xmldom.getelementsbytagname (v_doc, 'Passport');
                 
                 
                           FOR j IN 0 .. xmldom.getlength (v_list_passport) - 1
                           LOOP 
                                    
                              v_element_passport := xmldom.makeelement (xmldom.item (v_list_passport, j));
                              v_sernum  := xmldom.getattribute (v_element_passport, 'pn');
                              v_doc_date  := xmldom.getattribute (v_element_passport, 'pd');

                                DBMS_OUTPUT.PUT_LINE(v_sernum ||' '||  v_doc_date);
              
                            end loop;
                         
                 
                                  
             END LOOP;
             
            
                                
             
  END LOOP; 
  
   XMLDOM.freedocument (v_doc);
   
end;   





Как мне получить следующий вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
КОНУСЕВА  МАЯ ВАЛЕНТИНОВНА 12.12.1980
1212121212 30.05.1991
ИВАНОВА  МАРИНА ИВАНОВНА 27.12.1980
2121212121 17.06.1990
1313131313 24.08.1996
МИЛОБОКОВА ОЛЬГА ИВАНОВНА 05.12.1980
6504153760 25.04.1993
6508483028 26.11.1998
?
Т.е. чтобы каждой фио соответствовали данные из паспорта.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389090
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Год прошел, но может кто-нибудь заметит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389104
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Год прошел, но может кто-нибудь заметит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389118
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,

заметил. читайте про xmldom.getChildNodes
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389155
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,


в качестве примера
Код: 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.
declare

  v_doc xmldom.domdocument;

  v_list_person    xmldom.domnodelist;
  v_element_person xmldom.domelement;

  v_list_name    xmldom.domnodelist;
  v_element_name xmldom.domelement;
  v_first_name   varchar2(100);
  v_second_name  varchar2(100);
  v_last_name    varchar2(100);
  v_dob          date;

  v_list_passport    xmldom.domnodelist;
  v_element_passport xmldom.domelement;
  v_sernum           varchar2(100);
  v_doc_date         varchar2(100);

  p_xml          clob;
  l_children     dbms_xmldom.domnodelist;
  l_child        dbms_xmldom.domnode;
  l_text_content varchar2(32767);

begin
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991"/>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report>
').getclobval();

  v_doc         := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname(v_doc, 'Person');
  for i in 0 .. xmldom.getlength(v_list_person) - 1
  loop
      l_child := xmldom.item(v_list_person, i);
      l_children := xmldom.getchildnodes(l_child);
      for j in 0 .. xmldom.getlength(l_children) - 1
      loop
        l_child        := dbms_xmldom.item(l_children, j);
        l_text_content := xmldom.getnodename(l_child);
        if l_text_content = 'Name' then
          dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'n'));
        end if;
        if l_text_content = 'Passport' then
          dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'pn'));
        end if;
      end loop;
  end loop;
end;
  

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38389340
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,
ага, спасибо. =))
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38390751
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй, что-то не могу въехать. Допустим в xml появился новый тэг citizen:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991">
              <Citizen n="UA"/>
      </Passport>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report> 



как его вывести в таком виде:

КОНУСЕВА МАЯ ВАЛЕНТИНОВНА 12.12.1980
1212121212 30.05.1991
UA
ИВАНОВА МАРИНА ИВАНОВНА 27.12.1980
2121212121 17.06.1990
1313131313 24.08.1996
МИЛОБОКОВА ОЛЬГА ИВАНОВНА 05.12.1980
6504153760 25.04.1993
6508483028 26.11.1998

?
Попробовала несколько более или менее логичных вариантов (и продолжаю), но что-то с циклами не то или с местом объявления нодов. Подскажите.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38390975
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобралась:
Код: 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.
declare

  v_doc xmldom.domdocument;

  v_list_person    xmldom.domnodelist;
  v_element_person xmldom.domelement;

  v_list_name    xmldom.domnodelist;
  v_element_name xmldom.domelement;
  v_first_name   varchar2(100);
  v_second_name  varchar2(100);
  v_last_name    varchar2(100);
  v_dob          date;

  v_list_passport    xmldom.domnodelist;
  v_element_passport xmldom.domelement;
  v_sernum           varchar2(100);
  v_doc_date         varchar2(100);

  p_xml          clob;
  l_children     dbms_xmldom.domnodelist;
  l_child        dbms_xmldom.domnode;
  l_text_content varchar2(32767);

begin
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
       <Passport pn="1212121212" pd="30.05.1991">
              <Citizen f="UA"/>
      </Passport>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report>
').getclobval();

  v_doc         := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname(v_doc, 'Person');
  for i in 0 .. xmldom.getlength(v_list_person) - 1
  loop
      l_child := xmldom.item(v_list_person, i);
      l_children := xmldom.getchildnodes(l_child);
              for j in 0 .. xmldom.getlength(l_children) - 1
              loop
                l_child        := dbms_xmldom.item(l_children, j);
                l_text_content := xmldom.getnodename(l_child);
                if l_text_content = 'Name' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'n'));
                end if;
                      
                                     
                
                
                
                if l_text_content = 'Passport' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'pn'));
                  l_children := xmldom.getchildnodes(l_child);
                  
                  dbms_output.put_line('len ' || xmldom.getlength(l_children) );
                         FOR d IN 0 .. xmldom.getlength(l_children) - 1 LOOP
                            l_child        := dbms_xmldom.item(l_children, d);
                            l_text_content := xmldom.getnodename(l_child);
                                     if l_text_content = 'Citizen' then
                                    dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'f'));
                                    end if;
                         
                         
                         END LOOP;

                      
                  
                end if;
              end loop;
  end loop;
end;

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38391752
Фотография May12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй, что-то не могу въехать. Допустим в xml появился новый тэг citizen:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  p_xml := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<Report>
  <Persons>
    <Person>
      <Name s="КОНУСЕВА" n="МАЯ" m="ВАЛЕНТИНОВНА" d="12.12.1980"/>
      <Passport pn="1212121212" pd="30.05.1991">
              <Citizen n="UA"/>
      </Passport>
    </Person>
    <Person>
      <Name s="ИВАНОВА" n="МАРИНА" m="ИВАНОВНА" d="27.12.1980"/>
      <Passport pn="2121212121" pd="17.06.1990"/>
      <Passport pn="1313131313" pd="24.08.1996"/>
    </Person>
    <Person>
      <Name s="МИЛОБОКОВА" n="ОЛЬГА" m="ИВАНОВНА" d="05.12.1980"/>
      <Passport pn="6504153760" pd="25.04.1993"/>
      <Passport pn="6508483028" pd="26.11.1998"/>
    </Person>
  </Persons>
</Report> 



как его вывести в таком виде:

КОНУСЕВА МАЯ ВАЛЕНТИНОВНА 12.12.1980
1212121212 30.05.1991
UA
ИВАНОВА МАРИНА ИВАНОВНА 27.12.1980
2121212121 17.06.1990
1313131313 24.08.1996
МИЛОБОКОВА ОЛЬГА ИВАНОВНА 05.12.1980
6504153760 25.04.1993
6508483028 26.11.1998

?
Попробовала несколько более или менее логичных вариантов (и продолжаю), но что-то с циклами не то или с местом объявления нодов. Подскажите.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38391787
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
May12,
очень невнимательны. почему используете одни и теже переменные ?
Код: 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.
v_doc         := xmldom.newdomdocument(p_xml);
  v_list_person := xmldom.getelementsbytagname(v_doc, 'Person');
  for i in 0 .. xmldom.getlength(v_list_person) - 1
  loop
       l_child := xmldom.item(v_list_person, i); 
      l_children := xmldom.getchildnodes(l_child);
              for j in 0 .. xmldom.getlength(l_children) - 1
              loop
                l_child        := dbms_xmldom.item(l_children, j); 
                l_text_content := xmldom.getnodename(l_child);
                if l_text_content = 'Name' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'n'));
                end if;
                      
                                     
                
                
                
                if l_text_content = 'Passport' then
                  dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'pn'));
                  l_children := xmldom.getchildnodes(l_child);
                  
                  dbms_output.put_line('len ' || xmldom.getlength(l_children) );
                         FOR d IN 0 .. xmldom.getlength(l_children) - 1 LOOP
                            l_child        := dbms_xmldom.item(l_children, d); 
                            l_text_content := xmldom.getnodename(l_child);
                                     if l_text_content = 'Citizen' then
                                    dbms_output.put_line(l_text_content || ' ' || xmldom.getattribute(xmldom.makeelement(l_child), 'f'));
                                    end if;
                         
                         
                         END LOOP;

                      
                  
                end if;
              end loop;
  end loop;
end;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499692
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
create or replace procedure PR_DL_GPX(
--gpx in CLOB, 
--cur in out pkg_cursors.CurType
x in integer
) is

v_doc            dbms_xmldom.domdocument;
v_l_trkseg       dbms_xmldom.domnodelist;

v_l_trkpt        dbms_xmldom.domnodelist;
v_e_trkpt        dbms_xmldom.domelement;

v_l_dt           dbms_xmldom.domnodelist;
v_e_dt           dbms_xmldom.domelement;

lat              varchar2(20);
lon              varchar2(20);
dt               varchar2(20);
ele              varchar2(20);

gpx              clob;
begin
  
gpx := xmltype('<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="GNSS Data Interface">
  <trk>
    <name>GNSS Data Interface</name>
    <trkseg>
      <trkpt lat="61.6666343389" lon="50.8176451879">
        <time>2013-12-04T08:33:12Z</time>
        <ele>125.42</ele>
      </trkpt>
      <trkpt lat="61.6642848542" lon="50.8183690557">
        <time>2013-12-04T09:20:01Z</time>
        <ele>97.28</ele>
      </trkpt>
    </trkseg>
  </trk>
</gpx>
').GetStringVal();--getclobval();

v_doc := dbms_xmldom.newdomdocument(gpx);
v_l_trkseg := dbms_xmldom.getelementsbytagname (v_doc, 'trkseg');

for i in 0 .. dbms_xmldom.getlength (v_l_trkseg) - 1
loop

    v_l_trkpt := dbms_xmldom.getelementsbytagname (v_doc, 'trkpt');
    for j in 0 .. dbms_xmldom.getlength (v_l_trkpt) - 1
    loop
        
        v_e_trkpt := dbms_xmldom.makeelement (dbms_xmldom.item (v_l_trkpt, j));
        lat := dbms_xmldom.getattribute (v_e_trkpt, 'lat');
        lon := dbms_xmldom.getattribute (v_e_trkpt, 'lon');
        
        -- КАК ЗДЕСЬ ПОЛУЧИТЬ значения time and ele

    end loop;

end loop;

dbms_xmldom.freedocument (v_doc);

end PR_DL_GPX;



Все хорошо все работает, но не знаю как выташить данные без атрибута, например
<time>2013-12-04T08:33:12Z</time>
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499730
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DIGITALPRO,

проще же, быстрее и понятнее через xmltable:
Код: 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.
select *
from xmltable(xmlnamespaces(default 'http://www.topografix.com/GPX/1/1'),
              '/gpx/trk/trkseg/trkpt'
              passing xmltype(
                  '<?xml version="1.0" encoding="UTF-8"?>
                  <gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="GNSS Data Interface">
                    <trk>
                      <name>GNSS Data Interface</name>
                      <trkseg>
                        <trkpt lat="61.6666343389" lon="50.8176451879">
                          <time>2013-12-04T08:33:12Z</time>
                          <ele>125.42</ele>
                        </trkpt>
                        <trkpt lat="61.6642848542" lon="50.8183690557">
                          <time>2013-12-04T09:20:01Z</time>
                          <ele>97.28</ele>
                        </trkpt>
                      </trkseg>
                    </trk>
                  </gpx>
                  '
                  )
               columns 
                  lat    number        path '@lat'
                 ,lon    number        path '@lon'
                 ,"time" timestamp     path 'substring(time,1,19)'
                 ,ele    number        path 'ele'
               )

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

Незнал этого, спасибо!, НО

1. без подсказки /*+ CURSOR_SHARING_EXACT */ не работает
2. результат селекта 0 rows
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499854
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DIGITALPRO,

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

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

namespace укажи. и глюков с cursor_sharing не exact до 11й версии больше, чем в 11й. Да и с xmltable тоже.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38499916
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DIGITALPRO,

а конкретнее?
на 10.2.0.4 это работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> select * from v$version;

BANNER
----------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Solaris: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


Код: 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.
select/*+ cursor_sharing_exact */ *
from xmltable(xmlnamespaces(default 'http://www.topografix.com/GPX/1/1'),
              '/gpx/trk/trkseg/trkpt'
              passing xmltype(
                  '<?xml version="1.0" encoding="UTF-8"?>
                  <gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="GNSS Data Interface">
                    <trk>
                      <name>GNSS Data Interface</name>
                      <trkseg>
                        <trkpt lat="61.6666343389" lon="50.8176451879">
                          <time>2013-12-04T08:33:12Z</time>
                          <ele>125.42</ele>
                        </trkpt>
                        <trkpt lat="61.6642848542" lon="50.8183690557">
                          <time>2013-12-04T09:20:01Z</time>
                          <ele>97.28</ele>
                        </trkpt>
                      </trkseg>
                    </trk>
                  </gpx>
                  '
                  )
               columns 
                  lat    number        path '@lat'
                 ,lon    number        path '@lon'
                 ,"time" varchar2(100) path 'time'
                 ,ele    number        path 'ele'
               )

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

версия

1 Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
2 PL/SQL Release 10.2.0.5.0 - Production
3 CORE 10.2.0.5.0 Production
4 TNS for Linux: Version 10.2.0.5.0 - Production
5 NLSRTL Version 10.2.0.5.0 - Production


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

только

в '/trk/trkseg/trkpt'
сделали '//trk/trkseg/trkpt'
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XML в Oracle9i. Примеры разборки
    #38873286
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже запутался, вот пример
Код: 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.
declare
 xRetClob clob;
 xRet 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>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 
      cast(extract(Value(p), 'item/dF1 /text()').getStringVal() as NUMBER) df_1,
      cast(extract(Value(p), 'item/dF2 /text()').getStringVal() as NUMBER) df_2,
      cast(extract(Value(p), 'item/dF3 /text()').getStringVal() as NUMBER) df_3,
      cast(extract(Value(p), 'item/dF4 /text()').getStringVal() as NUMBER) df_4
     from
     Table(XMLSEQUENCE(EXTRACT(xRetXml,'//Body/getData/response/item', 'xmlns:x="http://www.test.ru/test/test/types/type1/v1"'))) p
    )
    LOOP    
      xRet := to_number(cr_result.df_1);
      dbms_output.put_line(xRet);
    END LOOP;
end;


ничего не показывает, а так хочется в цикле всё обработать.
Чувствую, что засада в неймспейсах, но понять не могу.
спасибо всем откликнувшимся.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873389
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,
Даю наводку (слитно) :
select count(1)
from
Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'))) p
возвращает 1 строку
select count(1)
from
Table(XMLSEQUENCE(EXTRACT(xRetXml,'//Body/*', 'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"'))) p
возвращает 0 строк
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873405
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtNick,

это мне сначала достать из soapenv, потом из NS1 и только потом из NSx?..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #38873411
ArtNick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,
select extract(Value(p), '*/node()')
from
Table(XMLSEQUENCE(EXTRACT(xRetXml,'//soapenv:Body/NS1:getData/*', 'xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:NS1="http://www.test.ru/test/test/service/service1/v1'))) p;
Если совсем коротко, soapenv:Body и Body это разные элементы, поэтому надо писать весь путь с ns. Соответственно их все надо определить третим парвметром (через пробел можно)
Получилось?
...
Рейтинг: 0 / 0
25 сообщений из 239, страница 7 из 10
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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