Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak uzyskać nazwę elementu nadrzędnego w wyrażeniu Oracle XPath?

Wyciąg pozwala spojrzeć wyżej w górę ścieżki, ale (jak wspomniano w dokumencie MOS 301709.1; który dotyczy 9i, ale nadal wydaje się prawidłowy, poza pokazanym błędem):

Więc nie możesz użyć name() , local-name() itp. funkcji w węźle bieżącym lub nadrzędnym. W tym dokumencie istnieje pewnego rodzaju obejście, które można nieco uprościć na podstawie ich przykładu:

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

Lub w nieco innej formie:

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

Demo z obydwoma:

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>                      

Ale extract() i tak jest przestarzałe . Możesz to zrobić za pomocą 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              

Jeśli potrzebujesz czegoś bardziej skomplikowanego, możesz wyciągnąć to, czego potrzebujesz z poziomów węzłów, jak pokazano w tej odpowiedzi; ale z tego, co powiedziałeś, to przesada.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zastąpić wartości null tekstem?

  2. SQLite do Oracle

  3. Wstawianie wielu wierszy do tabeli - pojawia się błąd ORA-00933:Polecenie SQL nie zostało poprawnie zakończone

  4. Oracle PL/SQL — wskazówki dotyczące natychmiastowego wydruku / drukowania z konsoli

  5. Nie można pobrać rekordów DO DATY Oracle