Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рекурсивная структура xml парсинг / 15 сообщений из 15, страница 1 из 1
26.01.2018, 18:00
    #39591847
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
Добрый день, помогите, пожалуйста, как разобрать рекурсивную 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
26.01.2018, 18:03
    #39591849
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
milediiraрекурсивную xmlЭто никакая не "рекурсивная xml".
...
Рейтинг: 0 / 0
26.01.2018, 18:16
    #39591855
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
Elic,
ок, иерархическую
...
Рейтинг: 0 / 0
26.01.2018, 18:31
    #39591871
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
Код: 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
27.01.2018, 05:58
    #39592064
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
andrey_anonymous,

спасибо большущее, Вы гений!
...
Рейтинг: 0 / 0
27.01.2018, 08:14
    #39592070
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
milediiraВы гений!Не совсем. Просто при относительном сравнении с нулём всё кажется недостижимой бесконечностью.
...
Рейтинг: 0 / 0
27.01.2018, 08:40
    #39592074
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
andrey_anonymous, а можно в этом запросе вывести еще и номер уровня в иерархии?
...
Рейтинг: 0 / 0
27.01.2018, 08:56
    #39592079
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
milediiraа можно в этом запросе вывести еще и номер уровня в иерархии?RTFM Hierarchical Queries (FAQ)
...
Рейтинг: 0 / 0
27.01.2018, 10:37
    #39592101
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
Elic, спасибо большое, все получилось.
...
Рейтинг: 0 / 0
27.01.2018, 13:17
    #39592133
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
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
27.01.2018, 13:25
    #39592136
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
+аналог 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
28.01.2018, 09:09
    #39592296
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
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
28.01.2018, 12:26
    #39592339
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
milediira,

это просто баг и он уже исправлен в 11.2.0.4, так что сноси XE и ставь что-нибудь посвежее
...
Рейтинг: 0 / 0
28.01.2018, 14:59
    #39592388
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
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
29.01.2018, 17:38
    #39592911
milediira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивная структура xml парсинг
xtender, спасибо большое! Действительно, установила Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production и запрос работает как надо! Тренируюсь дальше с xpath!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рекурсивная структура xml парсинг / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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