powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рекурсивная структура xml парсинг
15 сообщений из 15, страница 1 из 1
Рекурсивная структура xml парсинг
    #39591847
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, помогите, пожалуйста, как разобрать рекурсивную xml одним запросом?
select *
from table(XmlSequence (XmlType (
'<?xml version = "1.0"?>
<ROWSET>
<ROW num="1" name="la1"/>
<ROW num="2" name="la2">
<ROW num="22" parent_key ="2" name="la22"/>
<ROW num="23" parent_key ="2" name="la23"/>
</ROW>
</ROWSET>'
).extract('ROWSET/ROW'))) d;

Нужно получить строки вида
1 0 la1
2 0 la2
22 2 la22
23 2 la23
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39591849
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
milediiraрекурсивную xmlЭто никакая не "рекурсивная xml".
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39591855
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
ок, иерархическую
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39591871
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select num, nvl(parent_key,0) parent_key, name
from xmltable( '//ROW'
passing XmlType ('<?xml version = "1.0"?>
  <ROWSET><ROW num="1" name="la1"/>
          <ROW num="2" name="la2"><ROW num="22" parent_key ="2" name="la22"/>
                                  <ROW num="23" parent_key ="2" name="la23"/>
          </ROW>
  </ROWSET>')
columns num path '@num'
      , parent_key path '@parent_key' 
      , name path '@name'
) d;
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592064
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

спасибо большущее, Вы гений!
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592070
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
milediiraВы гений!Не совсем. Просто при относительном сравнении с нулём всё кажется недостижимой бесконечностью.
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592074
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous, а можно в этом запросе вывести еще и номер уровня в иерархии?
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592079
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
milediiraа можно в этом запросе вывести еще и номер уровня в иерархии?RTFM Hierarchical Queries (FAQ)
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592101
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, спасибо большое, все получилось.
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592133
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
milediiraandrey_anonymous, а можно в этом запросе вывести еще и номер уровня в иерархии?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  num, nvl(parent_key,0) parent_key, name
, path
, hierarchy_level
from xmltable( 
       '//ROW'
   passing 
     XmlType('<?xml version = "1.0"?>
              <ROWSET><ROW num="1" name="la1"/>
                      <ROW num="2" name="la2"><ROW num="22" parent_key ="2" name="la22"/>
                                              <ROW num="23" parent_key ="2" name="la23"/>
                      </ROW>
              </ROWSET>')
   columns num path '@num'
         , parent_key path '@parent_key' 
         , name varchar2(100) path '@name'
         , path varchar2(100) path 'string-join(ancestor-or-self::*/name(.), "/")'
         , hierarchy_level int path 'count(ancestor-or-self::*/name(.))-1'
) d;
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592136
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
+аналог sys_connect_by_path:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select 
  num, nvl(parent_key,0) parent_key, name
, xml_path
, num_path
, hierarchy_level
from xmltable( 
       '//ROW'
   passing 
     XmlType('<?xml version = "1.0"?>
              <ROWSET><ROW num="1" name="la1"/>
                      <ROW num="2" name="la2"><ROW num="22" parent_key ="2" name="la22"/>
                                              <ROW num="23" parent_key ="2" name="la23"/>
                      </ROW>
              </ROWSET>')
   columns num path '@num'
         , parent_key path '@parent_key' 
         , name       varchar2(100) path '@name'
         , xml_path   varchar2(100) path 'concat("/",string-join(ancestor-or-self::*/name(.), "/"))'
         , num_path   varchar2(100) path 'concat("/",string-join(ancestor-or-self::ROW/@num , "/"))'
         , hierarchy_level int path 'count(ancestor-or-self::*/name(.))-1'
) d;
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592296
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,
у меня почему-то так не работает. Уровень выводится как 0, а путь как до текущего элемента. Может быть это появилось в версиях выше чем моя (Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production)?
select
num, nvl(parent_key,0) parent_key, name
, xml_path
, num_path
, hierarchy_level
, parent_key1
from xmltable(
'//ROW'
passing
XmlType('<?xml version = "1.0"?>
<ROWSET><ROW num="1" name="la1"/>
<ROW num="2" name="la2"><ROW num="22" parent_key ="2" name="la22"/>
<ROW num="23" parent_key ="2" name="la23"/>
</ROW>
</ROWSET>')
columns num path '@num'
, parent_key path '@parent_key'
, name varchar2(100) path '@name'
, xml_path varchar2(100) path 'concat("/",string-join(ancestor-or-self::*/name(.), "/"))'
, num_path varchar2(100) path 'concat("/",string-join(ancestor-or-self::ROW/@num , "/"))'
, hierarchy_level int path 'count(ancestor-or-self::*/name(.))-1'
, parent_key1 varchar2(100) path 'concat("/",string-join(../@name, "/"))'
) d;


Выдает:
1 0 la1 /ROW /1 0 /
2 0 la2 /ROW /2 0 /
22 2 la22 /ROW /22 0 /
23 2 la23 /ROW /23 0 /
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592339
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
milediira,

это просто баг и он уже исправлен в 11.2.0.4, так что сноси XE и ставь что-нибудь посвежее
...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592388
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
milediira,

workaround для 11.2.0.2
Код: 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.
select/*+ NO_XML_QUERY_REWRITE */
   num, nvl(parent_key,0) parent_key, name
   , xml_path
   , num_path
   , hierarchy_level
from xmltable( 
'declare function local:path-to-node( $nodes as node()* ) as xs:string* {concat("/",$nodes/string-join(ancestor-or-self::*/name(), "/"))};
 declare function local:num_path( $nodes as node()* )     as xs:string* {concat("/",$nodes/string-join(ancestor-or-self::ROW/@num, "/"))};
 declare function local:hierarchy_level( $nodes as node()* ) as xs:integer* {count($nodes/ancestor-or-self::*/name(.))-1};
 for $r in //ROW
   return <ROW >
             {$r/@num       }
             {$r/@name      }
             {$r/@parent_key}
             <XMLPATH         >{local:path-to-node($r)   }</XMLPATH>
             <num_path        >{local:num_path($r)       }</num_path>
             <hierarchy_level >{local:hierarchy_level($r)}</hierarchy_level>
          </ROW>'
passing 
XmlType('<?xml version = "1.0"?>
         <ROWSET>
            <ROW num="1" name="la1"/>
            <ROW num="2" name="la2">
               <ROW num="22" parent_key="2" name="la22"/>
               <ROW num="23" parent_key="2" name="la23"/>
            </ROW>
         </ROWSET>')
columns
  num             int           path '@num'
, parent_key      number        path '@parent_key' 
, name            varchar2(100) path '@name'
, xml_path        varchar2(100) path 'XMLPATH'
, num_path        varchar2(100) path 'num_path'
, hierarchy_level int           path 'hierarchy_level'
) d;

...
Рейтинг: 0 / 0
Рекурсивная структура xml парсинг
    #39592911
milediira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender, спасибо большое! Действительно, установила Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production и запрос работает как надо! Тренируюсь дальше с xpath!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рекурсивная структура xml парсинг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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