PDA

View Full Version : XML einlesen mit XMLTABLE: übergeordnete Werte zu Gruppen hinzufügen.



dholtmann
28-03-18, 10:25
Hallo zusammen,

ich möchte gerne aus einer XML mit diesem Aufbau:


<Gruppe>
<Gruppennummer>5 <<!--</font-->Gruppennummer>
<Angestellte>
<Namen>
<Vorname>Max <<!--</font-->Vorname>
<Name>Mustermann <<!--</font-->Name>
<<!--</font-->Namen>

<Namen>
<Vorname>Max <<!--</font-->Vorname>
<Name>Mustermann <<!--</font-->Name>
<<!--</font-->Namen>
<angestellte> <angestellte>
<Gruppe>
</angestellte></angestellte>

eine Liste mit Gruppennummer, Name und Vorname erhalten.
Es kann allerdings unendlich viele Elemente "Namen" geben.

Mein erster Versuch war:



select Name, Vorname, Gruppennummer
from (values(xmlparse(document
get_xml_file(trim('//Beispiele/1.xml'))))) as xmlfile(BSP1),
xmltable('$BSP1/*:ExportFile/*:Gruppe'
passing xmlfile.BSP1 as "BSP1"
columns
Vorname varchar(64) default ''
path'*:Angestellte/*:Namen/*:Vorname',
Name varchar(64) default ''
path'*:Angestellte/*:Namen/*:Name',
Gruppe integer default 0 path'../Gruppennummer'



) as BSP1


leider wirft mir das
[SQ16003] Ein Ausdruck des Datentyps ( item(), item()+) kann nicht verwendet werden, wenn der Datentyp item() für den Kontext verwendet wird.


Nun dachte ich, ich könne einfach den Pfad eine Ebene tiefer ziehen:



select Name, Vorname, Gruppennummer
from (values(xmlparse(document
get_xml_file(trim('//Beispiele/1.xml'))))) as xmlfile(BSP1),
xmltable('$BSP1/*:ExportFile/*:Gruppe/*:Angestellte/*:Namen'
passing xmlfile.BSP1 as "BSP1"
columns
Vorname varchar(64) default ''
path'*:Vorname',
Name varchar(64) default ''
path'*:Name',
Gruppe integer default 0 path'../Gruppennummer'



) as BSP1


Diese Abfrage funktioniert für die Namen, ich erhalte jedoch leider keine Gruppennummer.

Kennt sich jemand damit aus? Habe schon eine Weile vergeblich gesucht und getestet.

Viele Grüße und besten Dank!

Fuerchau
28-03-18, 11:13
Ich denke, dass XMLTABLE da eher das liefert, was du benötigst (SQL-Handbuch).
In der Spaltendefinition kann man dann nämlich noch weitere Pfade angeben:



SELECT U."PO ID", U."Part #", U."Product Name",
U."Quantity", U."Price", U."Order Date"
FROM PURCHASEORDER P,
XMLTABLE(XMLNAMESPACES(’http://podemo.org’ AS "pod"),
’$po/PurchaseOrder/itemlist/item’ PASSING P.PORDER AS "po"
COLUMNS "PO ID" INTEGER PATH ’../../@POid’,
"Part #" CHAR(6) PATH ’product/@pid’,
"Product Name" CHAR(50) PATH ’product/pod:name’,
"Quantity" INTEGER PATH ’quantity’,
"Price" DECIMAL(9,2) PATH ’product/pod:price’,
"Order Date" TIMESTAMP PATH ’../../dateTime’
) AS U
WHERE P.STATUS = ’NEW’

Rainer Ross
28-03-18, 11:48
Folgende Statements habe ich mit Erfolg getestet


create or replace variable mylib.xml_var varchar(10000) ccsid 1208;

values mylib.xml_var;

set mylib.xml_var =
'<Gruppe>
<Gruppennummer>5</Gruppennummer>
<Angestellte>
<Namen>
<Vorname>Max</Vorname>
<Name>Mustermann</Name>
</Namen>

<Namen>
<Vorname>Heike</Vorname>
<Name>Musterfrau</Name>
</Namen>
</Angestellte>
</Gruppe>';

SELECT *
FROM XMLTABLE('/Gruppe/Angestellte/Namen'
PASSING XMLPARSE(
DOCUMENT mylib.xml_var
)
COLUMNS
gruppennummer integer PATH '../../Gruppennummer',
vorname varchar(20) PATH 'Vorname',
name varchar(20) PATH 'Name'
) AS RESULT;


Herzliche Grüße
Rainer

dholtmann
28-03-18, 12:05
Hallo,

Vielen Dank euch! so funktioniert es. '../../Gruppennummer'

Scheinbar kann man mi ../ jeweils immer eine Ordnung nach oben wechseln.

Viele Grüße,

Daniel

Rainer Ross
30-03-18, 13:15
Mit diesem Statement kann man die Daten direkt aus dem IFS lesen und parsen



SELECT *
FROM XMLTABLE('/Gruppe/Angestellte/Namen'
PASSING XMLPARSE(
DOCUMENT get_clob_from_file('/home/import/xml/angestellte.xml')
)
COLUMNS
gruppennummer integer PATH '../../Gruppennummer',
vorname varchar(20) PATH 'Vorname',
name varchar(20) PATH 'Name'
) AS RESULT;