Проблема с пространством имен Oracle XMLTABLE

Я пытаюсь получить конверт_ид как 80621b17-97a8-926d945b602a из приведенного ниже XML с помощью этого скрипта, но ничего не выходит. Может у кого-нибудь есть идеи?

SELECT b.EnvelopeID
FROM   sample_xml a,
       XMLTABLE(xmlnamespaces('http://www.w3.org/2001/XMLSchema' as "xsd_k",
                              'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                              'http://www.docusign.net/API/3.0' AS "k"),
       '/xsd_k:DocuSignEnvelopeInformation/xsd_k:EnvelopeStatus' PASSING a.xml
                       COLUMNS EnvelopeID        VARCHAR2(200)   PATH 'EnvelopeID')b;

Мой образец xml:

<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docgign.net/API/3.0">
  <EnvelopeStatus>
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID>
   </EnvelopeStatus>
</DocuSignEnvelopeInformation>

person xml_programmer    schedule 08.07.2016    source источник
comment
Вы получаете какие-либо ошибки?   -  person Andrej    schedule 08.07.2016
comment
Спасибо Андрей! У меня не было никаких ошибок, просто ничего не отображалось. Но ответ от Мотто ниже работает нормально. Благодарность   -  person xml_programmer    schedule 08.07.2016


Ответы (1)


Вы можете использовать пространство имен по умолчанию. Просто скажите «по умолчанию» :). И выглядеть так же, как в вашем XML-документе:

SELECT b.EnvelopeID
FROM   (SELECT xmltype ('
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docgign.net/API/3.0">
  <EnvelopeStatus>
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID>
   </EnvelopeStatus>
</DocuSignEnvelopeInformation>') AS xml FROM DUAL) a,
       XMLTABLE(xmlnamespaces(default 'http://www.docgign.net/API/3.0'),
       '/DocuSignEnvelopeInformation/EnvelopeStatus' PASSING a.xml
                       COLUMNS EnvelopeID        VARCHAR2(200)   PATH 'EnvelopeID')b;

Также можем отремонтировать ваш вариант. Сначала у вас есть «docgign» вместо «docusign» в документе xml. Ремонт одного из обоих. Затем замените '/xsd_k:DocuSignEnvelopeInformation/xsd_k:EnvelopeStatus' на '/k:DocuSignEnvelopeInformation/k:EnvelopeStatus', поскольку это пространство имен по умолчанию, и, наконец, измените 'EnvelopeID' на 'k:EnvelopeID':

SELECT EnvelopeID
FROM   (SELECT xmltype ('
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docusign.net/API/3.0">
  <EnvelopeStatus>
    <EnvelopeID>80621b17-97a8-926d945b602a</EnvelopeID>
   </EnvelopeStatus>
</DocuSignEnvelopeInformation>') AS xml FROM DUAL) a,
       XMLTABLE(xmlnamespaces('http://www.w3.org/2001/XMLSchema' as "xsd_k",
                              'http://www.w3.org/2001/XMLSchema-instance' AS "xsi",
                              'http://www.docusign.net/API/3.0' AS "k"),
       '/k:DocuSignEnvelopeInformation/k:EnvelopeStatus' PASSING a.xml
                       COLUMNS EnvelopeID        VARCHAR2(200)   PATH 'k:EnvelopeID')b;

См. ЗДЕСЬ (поиск пространства имен по умолчанию)

Когда для элемента используется объявление пространства имен по умолчанию, все неполные имена элементов в его области действия автоматически связываются с указанным идентификатором пространства имен.

По этой причине DocuSignEnvelopeInformation и все остальные узлы под ним имеют пространство имен xmlns="http://www.docusign.net/API/3.0". Если бы это пространство имен не было определено, узлы были бы без пространства имен, и вам не нужно было бы использовать пространство имен в xmltable.

person Mottor    schedule 08.07.2016
comment
Спасибо большое Мотор! Теперь это сработало. Помимо орфографической ошибки («docgign» вместо «docusign») здесь, мне было интересно, почему я не уверен, почему я не должен использовать xsd_k. Когда я должен использовать один по умолчанию и когда я должен использовать другие? заранее спасибо - person xml_programmer; 08.07.2016
comment
@xml_programmer Пространство имен по умолчанию, в котором находятся все узлы (поскольку они не используют имя пространства имен и есть пространство имен на корневом узле), — это пространство имен без имени xmlns=docusign.net/API/3.0. Все остальные имеют имена xsi,xsd. И когда узел должен находиться в пространстве имен с именем, имя должно использоваться как ‹xsi:DocuS....›. Что за макарон я написал? :) - person Mottor; 09.07.2016