Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да получите името на родителския елемент в израз на Oracle XPath?

Екстрактът ви позволява да търсите по-нагоре по пътя, но (както е отбелязано в MOS документ 301709.1; който е за 9i, но все още изглежда валиден, с изключение на показаната грешка):

Така че не можете да използвате name() , local-name() и т.н. функции, на текущия или родителския възел. В този документ има нещо като заобиколно решение, което може да бъде леко опростено от техния пример до:

EXTRACT(xmltype(d.data), '//ns1:myId/..', 
  'xmlns:ns1="http://acme.com/').getRootElement() xml2

Или в малко по-различна форма:

xmltype(d.data).extract('//ns1:myId/..', 
  'xmlns:ns1="http://acme.com/').getRootElement()

Демо с двете:

with data (pid, name, data) as (
  select 42, 'Test', '<?xml version="1.0" encoding="ISO-8859-1"?>
  <ns1:root xmlns:ns1="http://acme.com/"><ns1:parent><ns1:myId>1234</ns1:myId></ns1:parent></ns1:root>' from dual
)
select d.pid, d.name
, EXTRACT(xmltype(d.data), '//ns1:myId', 'xmlns:ns1="http://acme.com/') xml
, EXTRACT(xmltype(d.data), '//ns1:myId/..', 'xmlns:ns1="http://acme.com/').getRootElement() xml2
, xmltype(d.data).extract('//ns1:myId/..', 'xmlns:ns1="http://acme.com/').getRootElement() xml3
from DATA d
order by d.pid desc
;

       PID NAME XML                            XML2       XML3     
---------- ---- ------------------------------ ---------- ----------
        42 Test <ns1:myId xmlns:ns1="http://ac parent     parent    
                me.com/">1234</ns1:myId>                      

Но extract() така или иначе е отхвърлено . Можете да направите това с XMLTable :

with data (pid, name, data) as (
  select 42, 'Test', '<?xml version="1.0" encoding="ISO-8859-1"?>
  <ns1:root xmlns:ns1="http://acme.com/"><parent><myId>1234</myId></parent></ns1:root>' from dual
)
select d.pid, d.name, x.*
from data d
cross join xmltable(xmlnamespaces('http://acme.com/' as "ns1"),
  '/ns1:*//myId'
  passing xmltype(d.data)
  columns myId number path '.',
    parent varchar2(20) path './../local-name()'
) x
order by d.pid desc;

       PID NAME       MYID PARENT             
---------- ---- ---------- --------------------
        42 Test       1234 parent              

Ако имате нужда от нещо по-сложно, можете да изтеглите каквото ви трябва от нивата на възлите, както е показано в този отговор; но от това, което казахте, тук е пресилено.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL с ранг и дял

  2. Как да се справя с празна IN клауза в SQL Select Statement (IBatis 2)?

  3. SQL грешка ORA-01722:невалиден номер

  4. Възможно ли е да се прочете CLOB от отдалечена база данни на Oracle?

  5. .NET Core 2 + System.Data.OracleClient. Китайските йероглифи не работят