2017-10-26 3 views
0

Ich habe ein Problem beim Extrahieren des ersten Knotens aus einem bestimmten XML-Element in Oracle.Oracle XMLTYPE ersten Knoten extrahieren

Dies ist der XML:

<data type="TestData" version="1"> 
    <MasterTable Name="TestMaster"/> 
    <Table Name="TestTable1">Test</Table> 
    <Table Name="TestTable2"/> 
    <Table Name="TestTable3"/> 
    <Table Name="TestTable4"/> 
    <Table Name="TestTable5"/> 
    <Table Name="TestTable6"/> 
    <Table Name="TestTable7"/> 
    <Table Name="TestTable8"/> 
    <Table Name="TestTable9"/> 
    <Table Name="TestTable10"/> 
    <Table Name="TestTable11"/> 
    <Table Name="TestTable12"/> 
    <Table Name="TestTable13"/> 
    <Table Name="TestTable14"/> 
    <Fact Name="TestFact1"/> 
</data> 

Ich versuche, den Wert des ersten Namenselement "TestTable1" und dem Text für das erste Element Name "Test" zu extrahieren.

Ich habe folgende Abfragen, die null gerade zurückkehr:

select a.xml.extract('//Name[1]') from my_table a; --Attempting to return "TestTable1" from Name attribute 1 



select a.xml.extract('//Name[1]/text()') from my_table a; --Attempting to return the text "Test" from Name attribute 1 

Antwort

0
with test as(select xmltype('<data type="TestData" version="1"> 
    <MasterTable Name="TestMaster"/> 
    <Table OtherName="TestTable1">OtherTable</Table> 
    <Table Name="TestTable1">Test</Table> 
    <Table Name="TestTable2"/> 
    <Table Name="TestTable3"/> 
    <Table Name="TestTable4"/> 
    <Table Name="TestTable5"/> 
    <Table Name="TestTable6"/> 
    <Table Name="TestTable7"/> 
    <Table Name="TestTable8"/> 
    <Table Name="TestTable9"/> 
    <Table Name="TestTable10"/> 
    <Table Name="TestTable11"/> 
    <Table Name="TestTable12"/> 
    <Table Name="TestTable13"/> 
    <Table Name="TestTable14"/> 
    <Fact Name="TestFact1"/> 
</data>') x from dual) 


select t.x.extract('//Table[@Name][1]'),t.x.extract('//Table[1]'), t.x.extract('//Table[@Name][1]/text()'),t.x.extract('//Table[1]/text()'),t.x.extract('//Table[./text()][1]') from test t; 

t.x.extract('//Table[@Name][1]') kehrt erste 'Table'; mit Attribut Name t.x.extract('//Table[1]') gibt zuerst 'Tabelle' zurück;
t.x.extract('//Table[./text()][1]') erstes nicht leeres Tabellenelement zurückgeben;

+0

Vielen Dank für die Antwort! Zu dem, was ich tun wollte. t.x.extract ('// Table [@Name] [1]') gibt das gesamte Element z.

Test
, wo ich eigentlich nur TestTable1 zurückgeben wollte. Gibt es eine Möglichkeit, das zu tun? –

+0

'@ Attribut_name' für den Zugriff auf den Wert im Attribut' // Tabelle [@Name] [1]/@ Name' –

+0

Vielen Dank, alles funktioniert jetzt korrekt –

0

können Sie verwenden XMLTABLE:

SQL Fiddle

Oracle 11g R2 Schema-Setup:

CREATE TABLE table_name (xml) as 
select xmltype('<data type="TestData" version="1"> 
    <MasterTable Name="TestMaster"/> 
    <Table OtherName="TestTable1">OtherTable</Table> 
    <Table Name="TestTable1">Test</Table> 
    <Table Name="TestTable2"/> 
    <Table Name="TestTable3"/> 
    <Table Name="TestTable4"/> 
    <Table Name="TestTable5"/> 
    <Table Name="TestTable6"/> 
    <Table Name="TestTable7"/> 
    <Table Name="TestTable8"/> 
    <Table Name="TestTable9"/> 
    <Table Name="TestTable10"/> 
    <Table Name="TestTable11"/> 
    <Table Name="TestTable12"/> 
    <Table Name="TestTable13"/> 
    <Table Name="TestTable14"/> 
    <Fact Name="TestFact1"/> 
</data>') from dual; 

Abfrage 1:

SELECT x.* 
FROM table_name t 
     CROSS JOIN 
     XMLTABLE(
     '/data/Table[@Name][1]' 
     PASSING t.xml 
     COLUMNS Name VARCHAR2(20) PATH '@Name' 
     ) x 

Results:

|  NAME | 
|------------| 
| TestTable1 | 
Verwandte Themen