Whitepaper 09/2010 Seite 1 XML-Schnittstelle für System i Aufgabenstellung Aus einer vorgegebenen XML-Datei sollen Daten in eine AS/400-Tabelle übertragen werden. Bei der Übertragung besteht die Möglichkeit Daten per Mapping zu prüfen, zuzuordnen und zu verändern. Nach erfolgter Übertragung soll ein AS/400-Programm aufgerufen werden, mit dem die Daten verarbeitet werden. Konzept Um eine größtmögliche Flexibilität der Anwendung zu gewährleisten wird für die Konfiguration eine XML-Datei verwendet. Das Mapping wird in XSL realisiert. Dies ermöglicht in einfachen Fällen eine schnelle Umsetzung. Für komplexe Anforderungen steht der komplette Funktionsumfang von XSL zur Programmierung zur Verfügung. Für die Nachverarbeitung wird dann ein AS/400-Programm aufgerufen, so daß hier jede von der AS/400 unterstützte Programmiersprache verwendet werden kann (RPG, Java, COBOL,...). Funktionsweise Die Funktion der Schnittstelle beruht auf folgenden Schritten: • Start des Programms mit zwei Parametern: 1. XML-Datei mit den zu verarbeitenden Eingabedaten, 2. XML-Datei mit der Programmkonfiguration • Verarbeiten der XML-Daten und XSL-Transformation in SQL-Skript. • DatabaseConnect zur AS/400 und zeilenweise Ausführung des SQLSkripts (in der Regel INSERT INTO...) • Aufruf des AS/400-Programms zur weiteren Datenverarbeitung aus dem Execute-Tag der Konfigurationsdatei Michael J. Raber http://www.mjraber.de Document created with Whitepaper 09/2010 Seite 2 XML-Schnittstelle für System i Beispiel AS/400-Datei Die Beispiel-Datei kann mit folgendem Befehl erstellt werden: CREATE TABLE DEMOXML (FIELD1CHR CHAR (10 ) NOT NULL WITH DEFAULT, FIELD2DEC DECIMAL (10 , 3) NOT NULL WITH DEFAULT, FIELD3CHR CHAR (200 ) NOT NULL WITH DEFAULT) Beispiel XML-Eingabedatei <?xml version="1.0"?> <!-- Demo XML-Datei <!-<!-- www.mjraber.de <!-<DEMO> <RECORD> <F1>Feld1</F1> <F2>1.00</F2> <F3>Feld3Inhalt1</F3> </RECORD> <RECORD> <F1>Feld2</F1> <F2>2.00</F2> <F3>Feld3Inhalt2</F3> </RECORD> </DEMO> --> --> --> --> Beispiel Mapping <?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="iso-8859-1" indent="no"/> <xsl:template match="DEMO"> <xsl:apply-templates select="RECORD"/> </xsl:template> <xsl:template match="RECORD"> <xsl:text>insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values (</xsl:text> <xsl:text>'</xsl:text><xsl:value-of select="F1"/><xsl:text>',</xsl:text> <xsl:value-of select="F2"/><xsl:text>,</xsl:text> <xsl:text>'</xsl:text><xsl:value-of select="F3"/><xsl:text>'</xsl:text><xsl:text>) </xsl:text> </xsl:template> </xsl:stylesheet> Resultierendes SQL-Skript insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values ('Feld1',1.00,'Feld3Inhalt1') insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values ('Feld2',2.00,'Feld3Inhalt2') Michael J. Raber http://www.mjraber.de Document created with Whitepaper 09/2010 Seite 3 XML-Schnittstelle für System i Ergebnis in der AS/400-Datei FIELD1CHR FIELD2DEC FIELD3CHR 000001 Feld1 1,000 Feld3Inhalt1 000002 Feld2 2,000 Feld3Inhalt2 000003 Feld1 1,000 Feld3Inhalt1 000004 Feld2 2,000 Feld3Inhalt2 Beispiel Konfiguration <?xml version="1.0" encoding="ISO-8859-1"?> <root> <MAXCONTROL> <Info>Demo ConfigFile</Info> <Mapping>xsl\Demo.xsl</Mapping> <DBDriver>com.ibm.as400.access.AS400JDBCDriver</DBDriver> <iSSystem>192.168.1.1</iSSystem> <iSLibrary>MYLIB</iSLibrary> <iSUser>MYUSER</iSUser> <iSPassword>MYPWD</iSPassword> <Execute>SBMJOB CMD(CALL PGM(RABER/DEMOXML) PARM('XX'))</Execute> </MAXCONTROL> </root> Beispiel Aufruf Bei Verwendung des Programms auf Windows-Basis kann folgender Aufruf in einer BAT-Datei hinterlegt werden: java -classpath .;.\lib\jt400.jar;.\lib\fop.jar;.\lib\xalan2.4.1.jar;.\lib\xml-apis.jar de.mjraber.maxcontrol.MAXControl %1 %2 Bei direkter Ausführung auf der AS/400 ist ein analoges Shell-Skript für die Ausführung mittels QSH oder ein RUNJVA-Befehl erforderlich. Michael J. Raber http://www.mjraber.de Document created with Whitepaper 09/2010 Seite 4 XML-Schnittstelle für System i Beispiel Programmausgabe ***************************************************************************** * MAXControl Version 3 - www.mjraber.de * ***************************************************************************** XML-File......: xml/Demo.xml loading. ConfigFile....: DemoCfg.xml reading. ConfigFile....: Demo ConfigFile ConfigFile....: TransformationXSL: xsl\Demo.xsl SQL-Script....: xml/Demo.sql created. ConfigFile....: DBDriver: com.ibm.as400.access.AS400JDBCDriver ConfigFile....: DBURL: jdbc:as400://192.168.1.1/RABER;translate binary=true;user = MYUSR;password =MYPWD Connected to..: jdbc:as400://192.168.1.1/MYLIB;translate binary=true;user = MYUSER;password =MYPWD Driver........: AS/400 Toolbox for Java JDBC Driver Version.......: 6.0 Reading SQL...: xml\Demo.sql Running SQL...: Line 1 Statement: insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values ('Feld1',1.00,'Feld3Inhalt1') SQL-Result....: 1 Running SQL...: Line 2 Statement: insert into DEMOXML (FIELD1CHR, FIELD2DEC, FIELD3CHR) values ('Feld2',2.00,'Feld3Inhalt2') SQL-Result....: 1 Running SQL...: Line 3 Statement: Status........: Starting Processing. Status........: Setting system properties. ConfigFile....: iSeries System: 192.168.1.1 ConfigFile....: iSeries UserID: MYUSER Status........: Opening Server Command. Status........: Starting Server-Job as QZRCSRVS. Please wait... Execute.......: SBMJOB CMD(CALL PGM(RABER/DEMOXML) PARM('XX')) Job...........: QZRCSRVS/QUSER/734624 Status........: Server-Job finished. (SBMJOB CMD(CALL PGM(RABER/DEMOXML) PARM('XX'))) Status........: Server Job finished. Status........: Number of Messages: 1 Status........: Message: CPC1221: Job 734639/MYUSER/QDFTJOBD an Jobwarteschlange QBATCH in Bibliothek QGPL übergeben. Status........: Server Job Finished. Michael J. Raber http://www.mjraber.de Document created with Whitepaper 09/2010 Seite 5 XML-Schnittstelle für System i Anmerkungen • In der Konfigurationsdatei ist das Passwort in lesbarer Form hinterlegt. Bei Bedarf kann dies auch verschlüsselt werden. Dazu muß das Programm geringfügig erweitert werden. • In der Beispiel-XSL-Datei werden lediglich INSERT-Statements generiert. Prinzipiell sind hier aber auch alle anderen gültigen SQL-Anweisungen möglich. • Im Beispiel wurde ein sehr einfaches XSL-Mapping ohne jede Funktionalität verwendet. Es werden lediglich die XML-Tags F1, F2 und F3 auf die Datenbankfelder gemappt. Hier sind aber alle gültigen XSLFunktionen möglich (s. Quellen) • Das Programm enthält keinerlei Fehlerhandling. Es ist innerhalb des Mappings dafür zu sorgen, daß keinerlei Fehler im SQL-Skript erzeugt werden. So sollten im Zweifelsfalls Zeichenketten mit der XSL-Funktion substring gekürzt werden. Ebenso sollte mit Zahlenfeldern verfahren werden. Hier steht z. B. die XSL-Funktion format-number zur Verfügung. Auch Fehler durch doppelte Schlüssel dürfen nicht auftreten. Es ist daher zu empfehlen die Daten zunächst in eine Arbeitsdatei zu schreiben und dann per AS/400-Programm in die Produktionsdateien zu schreiben. Dort können dann Plausibilitätsprüfungen und Fehlerhandling erfolgen. Quellen XSLT-Literatur: Doug Tidwell: XSLT, ISBN 3-89721-292-7 Sal Mangano: XSLT Cookbook, ISBN 0-596-00372-2 Michael J. Raber http://www.mjraber.de Document created with