sql >> Database >  >> RDS >> Oracle

Hoe de naam van het bovenliggende element in een Oracle XPath-expressie te krijgen?

Met Extract kunt u hoger in het pad zoeken, maar (zoals vermeld in MOS-document 301709.1; dat is voor 9i maar lijkt nog steeds geldig, afgezien van de weergegeven fout):

U kunt de name() . dus niet gebruiken , local-name() etc. functies, op het huidige of bovenliggende knooppunt. Er is een soort tijdelijke oplossing in dat document, die enigszins kan worden vereenvoudigd van hun voorbeeld tot:

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

Of in een iets andere vorm:

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

Demo met beide:

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>                      

Maar extract() wordt sowieso afgeraden . U kunt dit doen met 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              

Als je iets ingewikkelders nodig hebt, kun je alles wat je nodig hebt uit de knooppuntniveaus halen, zoals weergegeven in dit antwoord; maar van wat je hebt gezegd, is dat hier overdreven.




  1. Wat is de beste manier om batchgewijs records op te halen van SQL Server?

  2. Weet iemand welke coderingstechniek JDeveloper/SQL Developer gebruikt om inloggegevens te behouden?

  3. Ontbrekende verbindingen in tomcat jdbc-verbindingspool

  4. Een variabele gebruiken voor de tabelnaam in de 'Van'-clausule in SQL Server 2008