Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Парсинг XML в реляционую структуру по набору правил  [new]
oleg_dov
Member

Откуда:
Сообщений: 188
Возникла необходимость парсить xml и по определенной логике складывать их в реляционные таблички, но структура довольно таки сложная и много условий выбора разных ветвей. Хочется обработать меняющиеся по структуре на внутреннем уровне (т.е. от типа сообщения или какого-то элемента, структура может поменяться или надо выбрать другие ветки xml в непоменявшейся структуры и т.д.) xml и складыать в одну табличку.
Например, есть две xml-ки
<object>
  <object_type>1</object_type>
  <object1>
   <object_property11>p11</object_property11>
   <object_property11>p12</object_property11>
  </object1> 
</object>

<object>
  <object_type>2</object_type>
  <object2>
   <object_property21>p21</object_property21>
   <sub_object_2>
         <object_property22>p22</object_property22>
    </sub_object_2>
  </object2>
</object>

Хотелось бы одной вьюхой получать что-нить в таком вие

ObjectNameObjectPropertySubObjectSubObjectProperty
object1p11
object2p21sub_object_2object_proerty22

Технически есть xml, который кладется в clob (варианты с XMLType и регистрацией xsd пока не рассматривал, т.к. парсить xml (clob) нужно поштучно и скорость должна быть приемлимой) и хочется сделать обертку в вие вьхи, которая вернет объект.
Пробовал через XMLTable, но непонятно как делать такие условные преобразования в XMLTable синтаксисе. Есть ли смысл парится с Xquery или лучше пробовать получать данные и алгоритм выбора реализовывать на sql?
Может кто подскажет правильное направление в решении такой задачи. Возможно с каким-то примером.

Спасибо
3 май 12, 23:15    [12504801]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в реляционую структуру по набору правил  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
что-то вроде этого?
SQL> 
with t as ( select XMLTYPE('<set>
<object><object_type>1</object_type><object1><object_property11>p11</object_property11><object_property11>p12</object_property11></object1></object>
<object><object_type>2</object_type><object2><object_property21>p21</object_property21><sub_object_2><object_property22>p22</object_property22></sub_object_2></object2></object>
</set>') x from dual)
select tt.* from t
     ,xmltable('for $i in /set/object return <row>
                  <object_name>{name($i/*[2])}</object_name>
                  <object_property>
                    {if ($i/object_type eq "1") then ($i/*/object_property11[1]/data(.)) else ""}
                    {if ($i/object_type eq "2") then ($i/*/object_property21[1]/data(.)) else ""}
                  </object_property>
                  <sub_object>
                    {if ($i/object_type eq "2") then ($i/*/*[2]/name(.)) else ""}
                  </sub_object>
                  <sub_object_property>
                    {if ($i/object_type eq "2") then ($i/*/*[2]/*[1]/name(.)) else ""}
                  </sub_object_property>
                 </row>
     ' passing t.x
     columns "ObjectName" varchar2(100) PATH '//row/object_name'
           , "ObjectProperty" varchar2(100) PATH '//row/object_property'
           , "SubObject" varchar2(100) PATH '//row/sub_object'
           , "SubObjectProperty" varchar2(100) PATH '//row/sub_object_property'
     ) tt;
 
ObjectName             ObjectProperty         SubObject              SubObjectProperty
---------------------- ---------------------- ---------------------- ----------------------
object1                p11                                           
object2                p21                    sub_object_2           object_property22
 
SQL> 
4 май 12, 11:32    [12506519]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в реляционую структуру по набору правил  [new]
IvaSteel
Member

Откуда: Киев
Сообщений: 244
andrey_anonymous
Подскажите, пожалуйста, можно ли преобразовать, после кляузы "columns", поле, например data_vvoda не в тип varchar2, а сразу в date?
А то подгружаю даты, как varchar2, а потом в шапке запросу привожу к to_date... не красиво получается :)
4 май 12, 12:31    [12506981]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг XML в реляционую структуру по набору правил  [new]
oleg_dov
Member

Откуда:
Сообщений: 188
Спасибо за пример
Похоже без Xquery не получиться
А где можно посмотреть такие примеры работы с xml?
4 май 12, 15:15    [12508683]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить