Oracle - Как разобрать xml с помощью xmltable

xml выглядит так:

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
   <soap12:Body>
     <BlockUpload xmlns="http://mftsolutions.com/">
       <data><Block xmlns="http://mftsolutions.com/BlockUploader/Block"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://mftsolutions.com/BlockUploader/Block BlockSchema.xsd">
     <Header>
         <Identifier>ID10567</Identifier>
     </Header>
 </Block></data>
     </BlockUpload>
   </soap12:Body>
 </soap12:Envelope>

Я хочу получить значение идентификатора элемента (ID10567).

Я пробовал такие запросы, но безрезультатно. Возможно, я что-то упустил в объявлениях xmlNamespaces:

select h_id
from test_xml, 
  xmltable(xmlNamespaces ( default 'http://mftsolutions.com/BlockUploader/Block' 
                          ,'http://mftsolutions.com/' as "mft"
                          ,'http://www.w3.org/2001/XMLSchema-instance' as "xsi"
                          ,'http://www.w3.org/2001/XMLSchema' as "xsd"
                          ,'http://www.w3.org/2003/05/soap-envelope' as "soap12"),
            '//soap12:Envelope/soap12:Body/BlockUpload/data/Block/Header'
                   PASSING XMLTYPE(xml)
                   COLUMNS
                     h_id VARCHAR2(1000) PATH 'Identifier')

Что я пропустил?

пример таблицы для этого запроса:

create table test_xml (xml clob);

insert into test_xml values ('<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
   <soap12:Body>
     <BlockUpload xmlns="http://mftsolutions.com/">
       <data><Block xmlns="http://mftsolutions.com/BlockUploader/Block"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://mftsolutions.com/BlockUploader/Block BlockSchema.xsd">
     <Header>
         <Identifier>ID10567</Identifier>
     </Header>
 </Block></data>
     </BlockUpload>
   </soap12:Body>
 </soap12:Envelope>');

person user3770485    schedule 24.06.2014    source источник


Ответы (1)


Узел <BlockUpload> в XML-документе принадлежит пространству имен "http://mftsolutions.com/". Ссылка на это пространство имен отсутствует в выражении Xpath.

Кроме того, узел <data> в документе неявно принадлежит одному и тому же пространству имен, поэтому правильный XPath для запроса должен выглядеть так:

'//soap12:Envelope/soap12:Body/mft:BlockUpload/mft:data/Block/Header'
person ThinkJet    schedule 24.06.2014