Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để lấy tên của phần tử mẹ trong biểu thức Oracle XPath?

Giải nén cho phép bạn tìm kiếm đường dẫn cao hơn, nhưng (như đã lưu ý trong tài liệu MOS 301709.1; dành cho 9i nhưng vẫn có vẻ hợp lệ, ngoại trừ lỗi được hiển thị):

Vì vậy, bạn không thể sử dụng name() , local-name() vv các chức năng, trên nút hiện tại hoặc nút cha. Có một cách giải quyết các loại trong tài liệu đó, có thể được đơn giản hóa một chút từ ví dụ của chúng thành:

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

Hoặc ở một hình thức hơi khác:

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

Demo với cả hai:

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>                      

Nhưng extract() vẫn không được dùng nữa . Bạn có thể thực hiện việc này với 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              

Nếu bạn cần thứ gì đó phức tạp hơn, bạn có thể lấy bất cứ thứ gì bạn cần từ các cấp nút, như được hiển thị trong câu trả lời này ; nhưng từ những gì bạn đã nói ở đây là quá mức cần thiết.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn Oracle - Chọn bản ghi sử dụng dữ liệu cột từ bảng đầu tiên

  2. Bảng truy vấn với danh sách các biến khác nhau bằng cách sử dụng như

  3. BigQuery có hỗ trợ thực thi lệnh ngay lập tức để chạy truy vấn động không?

  4. Chuyển đổi truy vấn tiên tri thành các loại do người dùng xác định trong pl / sql

  5. Làm thế nào để kết nối với Oracle 10g từ máy khách từ xa?