Разбор вложенного XML с пространствами имен в PLSQL - PullRequest
1 голос
/ 18 октября 2019

У меня есть xml, который выглядит ниже

<ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable">
  <ibm:employee id="144">
    <ibm:name>
      <ibm:first>James</ibm:first>
      <ibm:last>Bond</ibm:last>
    </ibm:name>
    <ibm:office>007</ibm:office>
    <ibm:phone>905-007-1007</ibm:phone>
    <ibm:salary currency="USD">77007</ibm:salary>
  </ibm:employee>
</ibm:dept>'

Я пытаюсь разобрать его с помощью функции XMLTable. Это то, что я пробовал -

select x.*,
       y.*
 from xml_tab t,
 XMLTable(XMLnamespaces('http://www.ibm.com/xmltable' as "ibm"),
 'ibm:dept/ibm:employee' 
 passing t.xml_data
 columns 
        empid NUMBER path '@id',
        office VARCHAR2(5) path 'ibm:office',
        name XMLTYPE path 'ibm:name' 
 ) x,
 XMLTable(
 'ibm:name'
 passing x.name 
     columns 
            firstname VARCHAR2(10) path 'ibm:first',
            lastname VARCHAR2(10) path 'ibm:last') y
 where t.id =3;

Однако, это ошибка с ошибкой ниже

ORA-19228: XPST0008 - undeclared identifier: prefix 'ibm' local-name 'ibm:name'

Надеясь, что кто-то может объяснить ошибку. ура!

Настройка данных

create table xml_tab
(
 id NUMBER,
 xml_data XMLType
 );



insert into xml_tab
values(3, XMLType.createXML('<ibm:dept bldg="123" xmlns:ibm="http://www.ibm.com/xmltable">
  <ibm:employee id="144">
    <ibm:name>
      <ibm:first>James</ibm:first>
      <ibm:last>Bond</ibm:last>
    </ibm:name>
    <ibm:office>007</ibm:office>
    <ibm:phone>905-007-1007</ibm:phone>
    <ibm:salary currency="USD">77007</ibm:salary>
  </ibm:employee>
</ibm:dept>'));

1 Ответ

4 голосов
/ 18 октября 2019

Если вы хотите использовать квалифицированные имена в выражениях PATH предложения COLUMNS, вам необходимо указать предложение XMLNAMESPACES ( Doc. ).

Таким образом, вам нужно индивидуально определить XMLnamespaces даже для второй XMLTable

(псевдоним может измениться, например ibm2 для второй таблицы, заменив все ibm:ibm2:) :

select x.*, y.*
  from xml_tab t,
       XMLTable(XMLnamespaces('http://www.ibm.com/xmltable' as "ibm"),
                'ibm:dept/ibm:employee' passing t.xml_data columns empid
                NUMBER path '@id',
                office VARCHAR2(5) path 'ibm:office',
                name XMLTYPE path 'ibm:name') x,
       XMLTable(XMLnamespaces('http://www.ibm.com/xmltable' as "ibm"),
                'ibm:name' passing x.name columns firstname VARCHAR2(10) path
                'ibm:first',
                lastname VARCHAR2(10) path 'ibm:last') y                
 where t.id = 3;

Демо

...