sql >> Databáze >  >> RDS >> Oracle

Jak získat název nadřazeného prvku ve výrazu Oracle XPath?

Extract vám umožní podívat se výše na cestu, ale (jak je uvedeno v dokumentu MOS 301709.1; který je pro 9i, ale stále se zdá platný, kromě zobrazené chyby):

Nemůžete tedy použít name() , local-name() atd. funkcí, na aktuálním nebo nadřazeném uzlu. V tomto dokumentu je několik druhů řešení, které lze v jejich příkladu mírně zjednodušit na:

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

Nebo v trochu jiné podobě:

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

Demo s oběma:

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() je každopádně zastaralá . Můžete to udělat 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              

Pokud potřebujete něco složitějšího, můžete vytáhnout, co potřebujete, z úrovní uzlů, jak je uvedeno v této odpovědi; ale z toho, co jsi řekl, je to přehnané.




  1. Schéma databáze průzkumů

  2. Správný fulltextový index Rails/PostgreSQL/pg_search

  3. Potřebují tabulky MySQL ID?

  4. Extrahování více úrovní xml dat pomocí xpath v postgresu