In einigen wenigen Schritten können Sie Ihre Tabelleninhalte mithilfe von SQL ins XML-Format übersetzen.
Dazu benötigt man lediglich zwei SQL-Statements und ein CL-Kommando. Wir beginnen zunächst mit den Vorarbeiten um unsere Beispiel-Tabelle zu erstellen. Sie besteht aus drei Feldern und für unser Beispiel schreiben wir gleich drei Datensätze:
CREATE TABLE qtemp.TESTXML (FIELD1 CHAR (10 ) , FIELD2 CHAR (256 ), FIELD3 NUMERIC (10 , 3)); INSERT INTO qtemp.TESTXML VALUES('Record1', 'Description1', 1); INSERT INTO qtemp.TESTXML VALUES('Record2', 'Description2', 2); INSERT INTO qtemp.TESTXML VALUES('Record3', 'Description3', 3);
Damit erhalten wir unsere Beispiel-Daten, die wir nun in XML umsetzen wollen.
Record1 | Description1 | 1.000 |
Record2 | Description2 | 2.000 |
Record3 | Description3 | 3.000 |
Dazu erstellen wir eine temporäre Tabelle, die unsere XML-Daten aufnimmt:
create table qtemp.myxml as (select xmlserialize( xmlelement(NAME "MyXMLRecord", xmlelement(NAME "RecNbr", field3), xmlelement(NAME "RecordName", trim(field1)), xmlelement(NAME "RecordDescription", trim(field2))) as char(1024)) as "XMLResult" from qtemp.testxml) with data;
Mit diesem SQL-Statement stehen unsere Daten in einer Tabelle und wir müssen sie lediglich in eine Textdatei im IFS ausgeben. Dazu dient ein CL-Kommando:
CPYTOIMPF FROMFILE(MYXML) TOSTMF('/myxml.xml') MBROPT(*REPLACE) FROMCCSID(1252) RCDDLM(*CRLF) STRDLM(*NONE)
Damit steht der Inhalt in XML-Format in einer Datei wie folgt zur Verfügung:
<MyXMLRecord><RecNbr>1.000</RecNbr><RecordName>Record1</RecordName><RecordDescription>Description1</RecordDescription></MyXMLRecord> <MyXMLRecord><RecNbr>2.000</RecNbr><RecordName>Record2</RecordName><RecordDescription>Description2</RecordDescription></MyXMLRecord> <MyXMLRecord><RecNbr>3.000</RecNbr><RecordName>Record3</RecordName><RecordDescription>Description3</RecordDescription></MyXMLRecord>
Auch die Darstellung in XML-Tabellenform ist möglich, dazu können die jeweiligen Schlüsselworte „tr“ und „td“ für die Zeile beziehungsweise für die Spalte verwendet werden.
select xmlserialize( content xmlelement( name "tr", xmlelement(name "td", field1), xmlelement(name "td", field2), xmlelement(name "td", field3), ) as clob(120) ) as "result" from qtemp.myxml
Das Ergebnis sieht dann wie folgt aus:
<tr><td>Record1</td><td>Description1</td><td>1.000</td></tr> <tr><td>Record2</td><td>Description2</td><td>2.000</td></tr> <tr><td>Record3</td><td>Description3</td><td>3.000</td></tr>
Alternativ kann dasselbe Ergebnis erzielt werden, indem die XMLFOREST-Funktion verwendet wird. Diese funktioniert wie eine Ansammlung von xmlelement-Funktionen und kann dementsprechend angewandt werden.
select xmlserialize( content xmlelement( name "tr", xmlforest( field1 as "td", field2 as "td", field3 as "td" ) ) as clob(120) ) as "result" from qtemp.myxml
Möchten wir den Knoten nun zusätzlich noch Attribute zuordnen, können wir das mithilfe der XMLATTRIBUTES-Funktion tun.
select xmlserialize( content xmlelement( name "tr", xmlelement(name "td", xmlattributes('center' as "align"), field1), xmlelement(name "td", xmlattributes('center' as "align"), field2), xmlelement(name "td", xmlattributes('center' as "align"), field3), ) as clob(120) ) as "result"
Das Ergebnis sieht dann dementsprechend aus, in der Tabelle werden alle Zelleninhalte mittig formatiert:
<tr><td align="center">Record1</td><td align="center">Description1</td><td align="center">1.000</td></tr> <tr><td align="center">Record2</td><td align="center">Description2</td><td align="center">2.000</td></tr> <tr><td align="center">Record3</td><td align="center">Description3</td><td align="center">3.000</td></tr>