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

Есть xml, начинающийся с:

<export xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/oos/export/1" xmlns:oos="http://example.com/oos/types/1">
<contract>
<oos:id>4856602</oos:id>
<oos:regNum>0120100010112000149</oos:regNum>
<oos:number>0120100010112000037-0005596-01</oos:number>
...
...
...

Получается вытащить id

xmltable(
        xmlnamespaces(
            default 'http://example.com/oos/export/1',
            'http://example.com/oos/types/1' as "oos"
        ),
        '/export/contract/oos:id'
        passing FIELD
        columns
            id number path '.'
    ) xt


Но как вытащить несколько полей (в данном случае id, regNum и number)? Подскажите
23 апр 12, 13:20    [12456364]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
AmKad
Member

Откуда:
Сообщений: 5222
oraxml,

with s as (select '
<export xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/oos/export/1" xmlns:oos="http://example.com/oos/types/1">
  <contract>
    <oos:id>4856602</oos:id>
    <oos:regNum>0120100010112000149</oos:regNum>
    <oos:number>0120100010112000037-0005596-01</oos:number>
  </contract>
</export>' xml from dual)
select id, regnum, numb
from s,
xmltable(
        xmlnamespaces(
            default 'http://example.com/oos/export/1',
            'http://example.com/oos/types/1' as "oos"
        ),
        '/export/contract'
        passing xmltype(xml)
        columns
            id     number             path 'oos:id',
            regnum varchar2(100 char) path 'oos:regNum',
            numb   varchar2(100 char) path 'oos:number'
    );
    
23 апр 12, 13:32    [12456472]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
oraxml
Guest
AmKad, блин, спасибо, добрый человек. А я все время пихал еще один слэш в '/export/contract'

Спасибо еще раз
23 апр 12, 13:45    [12456588]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
oraxml
Guest
Еще вопрос. Если вдруг далее встречаются повторяющиеся узлы

<oos:products>
      <oos:product>
	<oos:name></oos:name>
	<oos:price></oos:price>
        <oos:quantity></oos:quantity>
        <oos:sum></oos:sum>
      </oos:product>
      <oos:product>
	<oos:name></oos:name>
	<oos:price></oos:price>
        <oos:quantity></oos:quantity>
        <oos:sum></oos:sum>
      </oos:product>
</oos:products>


То запрос выдает сообщение

ORA-19279: XPTY0004 - несоответствие динамического типа XQuery: ожидалась одноэлементная последовательность - получена последовательность из нескольких элементов

Я их могу вытащить отдельным запросом, указав '/export/contract/oos:products/oos:product' и columns name varchar2(100 char) path 'oos:name'. Но нельзя ли это совместить в одном запросе? Или так работать неверно?
24 апр 12, 16:21    [12463989]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
AmKad
Member

Откуда:
Сообщений: 5222
oraxml
Я их могу вытащить отдельным запросом
Так и делай.
24 апр 12, 16:25    [12464027]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
oraxml
Guest
AmKad
oraxml
Я их могу вытащить отдельным запросом
Так и делай.

Ок, спасибо
24 апр 12, 16:41    [12464148]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
IgorD
Member

Откуда: Анадырь ;)
Сообщений: 276
Добрый день!
Помогите, пожалуйста. Не могу разобраться с парсингом XML. Ранее делал с простой структурой с помощью XMLsequence - получалось. Тут немного посложнее. Компиляция ошибок не выдает, но и данных не возвращает.
with s as
 (select xmltype('<?xml version="1.0" encoding="UTF-8"?>
<ListPEP xmlns="ISPPAPEP">
  <peprecord xmlns="peprecord" id="5407" name="Иванов" firstname="Иван" surname="Иванович" >
    <pepwork xmlns="pepwork" idwork="5407" codework="">
      <pepsource xmlns="pepsource" idsource="476" />
    </pepwork>
  </peprecord>
  <peprecord xmlns="peprecord" id="7363" name="Петров" firstname="Петр" surname="Петрович">
    <pepwork xmlns="pepwork" idwork="7451" codework="00152135">
      <pepsource xmlns="pepsource" idsource="8013" />
    </pepwork>
    <peplink xmlns="peplink" id="22191" Link="Директор" />
    <peplink xmlns="peplink" id="31570" Link="И.О.Директора" />
  </peprecord>
 </ListPEP>') xmlcol
    from dual)

select t.id
  from s,
       XMLTable(
         XMLNameSpaces ( default 'ISPPAPEP',
           'peprecord'  as "pr",
           'pepwork' as "pw",
           'pepsource' as "ps",
           'peplink' as "pl"
           ),
           '/ListPEP'
           passing s.xmlcol
           columns
            id number path 'pr:id'
       ) t     
26 янв 18, 10:55    [21140829]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Ошибко:
path 'pr:id'

id - АТРИБУТ
26 янв 18, 11:01    [21140864]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6700
IgorD,

Для начала, что ты пытаешься получить? У тебя нет элемента id, зато такой атрибут есть в совершенно разных нодах.
26 янв 18, 11:13    [21140919]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
судя по pr:
IgorD
'pr:id'
он хочет это:
with s as
 (select xmltype('<?xml version="1.0" encoding="UTF-8"?>
<ListPEP xmlns="ISPPAPEP">
  <peprecord xmlns="peprecord" id="5407" name="Иванов" firstname="Иван" surname="Иванович" >
    <pepwork xmlns="pepwork" idwork="5407" codework="">
      <pepsource xmlns="pepsource" idsource="476" />
    </pepwork>
  </peprecord>
  <peprecord xmlns="peprecord" id="7363" name="Петров" firstname="Петр" surname="Петрович">
    <pepwork xmlns="pepwork" idwork="7451" codework="00152135">
      <pepsource xmlns="pepsource" idsource="8013" />
    </pepwork>
    <peplink xmlns="peplink" id="22191" Link="Директор" />
    <peplink xmlns="peplink" id="31570" Link="И.О.Директора" />
  </peprecord>
 </ListPEP>') xmlcol
    from dual)

select t.id
  from s,
       XMLTable(
         XMLNameSpaces ( default 'ISPPAPEP',
           'peprecord'  as "pr",
           'pepwork' as "pw",
           'pepsource' as "ps",
           'peplink' as "pl"
           ),
           '/*:ListPEP/*:peprecord'
           passing s.xmlcol
           columns
            id number path '@id'
       ) t  
26 янв 18, 11:45    [21141061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
IgorD
Member

Откуда: Анадырь ;)
Сообщений: 276
Спасибо. Начинаю прозревать. :)
Вытащить нужно все значения атрибутов. Причем peplink может иметь несколько записей для одной peprecord
26 янв 18, 11:59    [21141146]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
IgorD
Спасибо. Начинаю прозревать. :)
Вытащить нужно все значения атрибутов. Причем peplink может иметь несколько записей для одной peprecord

Покажите ожидаемый результат для приведенного XML
26 янв 18, 12:02    [21141159]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
IgorD
Member

Откуда: Анадырь ;)
Сообщений: 276
andrey_anonymous
Покажите ожидаемый результат для приведенного XML


pr_id pr_name pr_firstname pr_surname pw_idwork pw_codework ps_idsource pl_id pl_link
5407 Иванов Иван Иванович 5407 476
7363 Петров Петр Петрович 7451 00152135 8013 22191 Директор
7363 Петров Петр Петрович 7451 00152135 8013 31570 И.О. Директора
26 янв 18, 12:17    [21141236]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
IgorD,

+
with s as
 (select xmltype('<?xml version="1.0" encoding="UTF-8"?>
<ListPEP xmlns="ISPPAPEP">
  <peprecord xmlns="peprecord" id="5407" name="Иванов" firstname="Иван" surname="Иванович" >
    <pepwork xmlns="pepwork" idwork="5407" codework="">
      <pepsource xmlns="pepsource" idsource="476" />
    </pepwork>
  </peprecord>
  <peprecord xmlns="peprecord" id="7363" name="Петров" firstname="Петр" surname="Петрович">
    <pepwork xmlns="pepwork" idwork="7451" codework="00152135">
      <pepsource xmlns="pepsource" idsource="8013" />
    </pepwork>
    <peplink xmlns="peplink" id="22191" Link="Директор" />
    <peplink xmlns="peplink" id="31570" Link="И.О.Директора" />
  </peprecord>
 </ListPEP>') xmlcol
    from dual)

select
    pr_id        
   ,pr_name      
   ,pr_firstname 
   ,pr_surname   
   ,pw.*
   ,pl.*
  from s,
       XMLTable(
         XMLNameSpaces ( default 'ISPPAPEP',
           'peprecord'  as "pr",
           'pepwork' as "pw",
           'pepsource' as "ps",
           'peplink' as "pl"
           ),
           '/*:ListPEP/*:peprecord'
           passing s.xmlcol
           columns
             pr_id         number path '@id'
            ,pr_name       varchar2(100) path '@name'
            ,pr_firstname  varchar2(100) path '@firstname'
            ,pr_surname    varchar2(100) path '@surname'
            ,pepwork xmltype path '*:pepwork'
            ,peplink xmltype path '*:peplink'
       ) pr  
      ,xmltable(
        '*:pepwork'
        passing pr.pepwork
        columns 
            pw_idwork   number       path '@idwork'
           ,pw_codework varchar2(39) path '@codework'
        )(+) pw
      ,xmltable(
        '//*:peplink'
        passing pr.peplink
        columns 
            pl_id   number       path '@id'
           ,pl_link varchar2(39) path '@Link'
        )(+) pl
26 янв 18, 12:38    [21141334]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
IgorD
Member

Откуда: Анадырь ;)
Сообщений: 276
xtender,
Огромное СПАСИБО!!!!!
26 янв 18, 12:41    [21141351]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
IgorD
Member

Откуда: Анадырь ;)
Сообщений: 276
вдогонку вопрос по производительности.
Блогеры пишут, что использование конструкции с XMLNameSpaces более производительней (в разы) чем с использованием XMLsequence.
Так ли это?
26 янв 18, 12:53    [21141409]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
Elic
Member

Откуда:
Сообщений: 29976
IgorD
использование конструкции с XMLNameSpaces более производительней (в разы) чем с использованием XMLsequence.
Ты путаешь тёплое с мягким.
26 янв 18, 12:58    [21141428]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
IgorD
Member

Откуда: Анадырь ;)
Сообщений: 276
Elic,

Согласен. Не точно выразился. XMLTable vs ExctractValue
26 янв 18, 13:11    [21141478]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с XMLTABLE при наличии namespaces  [new]
Elic
Member

Откуда:
Сообщений: 29976
IgorD
Не точно выразился. XMLTable vs ExctractValue
Всё равно не точно. Но внимательно прочитай замечание из доки и к ExctractValue, и к XMLsequence.
26 янв 18, 13:27    [21141554]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить