Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara mendapatkan nama elemen induk dalam ekspresi Oracle XPath?

Ekstrak memungkinkan Anda melihat jalur yang lebih tinggi, tetapi (seperti yang dicatat dalam dokumen MOS 301709.1; yang untuk 9i tetapi tampaknya masih valid, terlepas dari kesalahan yang ditampilkan):

Jadi Anda tidak dapat menggunakan name() , local-name() dll. fungsi, pada node saat ini atau induknya. Ada semacam solusi dalam dokumen itu, yang dapat disederhanakan sedikit dari contohnya menjadi:

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

Atau dalam bentuk yang sedikit berbeda:

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

Demo dengan keduanya:

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>                      

Tapi extract() tetap tidak digunakan lagi . Anda dapat melakukannya dengan 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              

Jika Anda membutuhkan sesuatu yang lebih rumit, Anda dapat menarik apa pun yang Anda butuhkan dari level simpul, seperti yang ditunjukkan dalam jawaban ini; tapi dari apa yang Anda katakan itu berlebihan di sini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memasukkan karakter baris baru di Oracle?

  2. Lewati hak istimewa tabel dan DENGAN GRANT OPTION dengan membuat tampilan

  3. Isi nilai null dengan jumlah non-null terakhir - Oracle SQL

  4. Menginstal Oracle 12c Enterprise Edition di Windows 7

  5. Bagaimana cara mempercantik output yang berasal dari kueri SELECT di command prompt?