24. Modul XMLSAX - XML lesen

24.1. Allgemeines

Mit dem Modul XMLSAX können XML-Dateien gelesen werden. Das Modul basiert auf dem im Apache Projekt XERCES implementierten SAX Parser.

XMLSAX wird mit:

|INCL \script\xmlsax.mod

in einer ICS RUN1-Konfiguration verfügbar gemacht.

24.2. Abhängigkeiten von anderen Modulen

Keine Abhängigkeiten vorhanden.

24.3. Parametermap XMLSAX_PARAM

Folgende Parameter können in der Map XMLSAX_PARAM gesetzt werden:

Parameterreq/optBeschreibung
STATISTICSoON oder OFF. Objektstatistik am Ende der .log Datei ausgeben.
ELEMENT_LEVELo<level> oder OFF. Definiert von welcher Verschachtelungstiefe (Level) die XML-Elemente geliefert werden sollen. z.B. Für INTERLIS XTF-Files ist der Level=4 sinnvoll, da damit die Instanzen der Klassen geliefert werden <TRANSFER><DATASECTION><Topic><Class> . Mit OFF werden alle Elemente aller Level geliefert. Dies eignet sich nicht bei sehr grossen XML Dateien. z.B würde bei einem INTERLIS-XTF-File unter allen Elementen auch der ganze Inhalt im Element <TRANSFER> geliefert. Dies könnte bei einem sehr grossen File zu einem Abbruch wegen zuwenig Memory führen.
ELEMENT_PARENT_INFO_LEVELo<level> oder OFF. Bis zu welcher Verschachtelungstiefe (Level) Informationen zu Parentelementen eines Elementes geliefert werden sollen.

24.4. Objektmodell

Der Modul XMLSAX liefert pro IN-Objekt folgende Systemkomponenten:

Komponentenreq/optBeschreibung
IN.XML_LINE(i)rZeilennummer der aktuellen Elementes
IN.XML_COLUMN(i)rKolonnennummer des aktuellen Elementes
IN.XML_LEVEL(i)rVerschachtelungstiefe (Level) des aktuellen Elementes
IN.XML_ELEMENT_LEVEL_*(s)oNamen der Parentelemente pro Verschachtelungstiefe (Level) des aktuellen Elementes. Nur wenn Parameter ELEMENT_PARENT_INFO_LEVEL gesetzt ist.
IN.XML_ELEMENT_PARENT(s)rNamen des Parentelementes des aktuellen Elementes
IN.XML_ELEMENT(s)rNamen des aktuellen Elementes
IN.DATA(s)oDen Datenwert des aktuellen Elementes.
IN.<attribut>(s)oAttribute des aktuellen Elementes. Der Wert ist immer ein String.
IN.<element>(m|li)oChildelemente des aktuellen Elementes. Ist das Childelement nur einmal vorhanden, so ist der Wert vom Typ MAP. Ist das Childelement mehrmals vorhanden, so ist der Wert vom Typ LIST mit einer MAP pro Child. Pro Child sind in der Map wieder die Komponenten des Objektmodelles vorhanden.

24.5. Objektmodell bei einem SAX-Ereignis

Das Modul liest das XML File als SAX Parser. Dabei werden vom SAX Parser Ereignisse (Events) gemeldet. Für die Events kann optional eine Prozedur gesetzt werden (siehe später). Die Prozedur erhält die Ereignisse in der Form des IN-Objektes geliefert. Das IN-Objekt weist folgende Komponenten auf.

Komponentenreq/optBeschreibung
IN.XML_LINE(i)rZeilennummer des aktuellen Events
IN.XML_COLUMN(i)rKolonnennummer des aktuellen Events
IN.XML_LEVEL(i)rVerschachtelungstiefe (Level) des aktuellen Events
IN.XML_SAXEVENT(s)rName des aktuellen Events. Unterstützt werden zur Zeit die Events startElement, endElement, characters.
IN.XML_ELEMENT(s)oNamen des aktuellen Elementes. Nur wenn ein Element am Ereignis beteiligt ist. Beispiel Ereignis startElement, endElement
IN.<attribut>(s)oAttribute des aktuellen Elementes. Nur wenn das aktuelle Element des Ereignisses Attribute aufweist. Beispiel Ereignis startElement .
IN.DATA(s)oDen Datenwert des aktuellen Ereignisses. Nur wenn das Ereignis einen Datenwert beinhaltet. Beispiel Ereignis characters .

Mehr zu SAX Events finden Sie im Internet unter den Spezifikationen zu SAX unter www.saxproject.org .

24.6. Exportierte Prozeduren und Methoden

ProzedurXLMSAX_OPEN ! [s input][]
BeschreibungÖffnet die XML-Datei <input>. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
'c:\test\test.xml' XLMSAX_OPEN
ProzedurXMLSAX_READ_OBJECT ! [][b state]
Beschreibung

Liest das nächste Objekt aus der aktuellen XML-Datei. Das Objekt wird in der MAP IN zurückgegeben.

Beispiel
XLMSAX_READ_OBJECT [TRUE]
ProzedurXMLSAX_CLOSE ! [][]
BeschreibungSchliesst den Modul und gibt die durch den Modul belegten Resourcen wieder frei. Die Prozedur wird von RUN1 automatisch aufgerufen.
Beispiel
XMLSAX_CLOSE
ProzedurXMLSAX.SET_SAX_EVENT_PROCEDURE ! [* procedure][]
BeschreibungDefiniert eine Procedure die bei SAX Ereignissen aufgerufen wird. Diese SAX Event Procedure wird nur aufgerufen, wenn auch mit XMLSAX_READ_OBJECT Objekte aus der XML Datei gelesen werden.
Beispiel
PROCEDURE SAX_EVENT
   DISPLAY '>>>>>>>>>>>>>>>>>>'
   DISPLAY 'SAX_EVENT'
   DISPLAY IN
   DISPLAY '>>>>>>>>>>>>>>>>>>'
END_PROCEDURE

&SAX_EVENT XMLSAX.SET_SAX_EVENT_PROCEDURE
ProzedurXMLSAX.FILE_IS_VALID ! [s file][b status]
BeschreibungTest ob ein XML-File gültig ist. Tritt mindestens ein "fatal error" auf, ist der Rückgabewert FALSE, sonst TRUE . Ein "fatal error" entspricht einem "fatal error" des XERCES SAX Parsers, z.B. ein fehlendes End-Tag ein Elements. Ein XML-File mit "fatal error" kann eventuell trotzdem gelesen werden.
Beispiel
'test.xml' XMLSAX.FILE_IS_VALID  [TRUE]

24.7. Skriptbeispiel

! Diese ICS Konfiguration zeigt alle von xmlsax.mod
! gelesenen Objekte in der .log Datei an.

|LICENSE \license\iltools.lic

MAP USER_INPUT1
   DIALOG => FILE
   MESSAGE => 'Enter .xml Input File'
   FILE_FILTER => xml
   FILE_EXISTS => TRUE
   OPT => input
END_MAP

MAP XMLSAX_PARAM
   ELEMENT_LEVEL => 4
   ELEMENT_PARENT_INFO_LEVEL => 1
   STATISTICS => ON
END_MAP

MAP INPUT_SOURCES
   I1 => XMLSAX,OPT.input
END_MAP

MAP INOUT
   I1 => DISPLAY_OBJECT1,IN
END_MAP

PROCEDURE SAX_EVENT
   DISPLAY '>>>>>>>>>>>>>>>>>>'
   DISPLAY 'SAX_EVENT'
   DISPLAY IN
   DISPLAY '>>>>>>>>>>>>>>>>>>'
END_PROCEDURE

PROCEDURE PRE_TRANSFER
   &SAX_EVENT   ROOT.XMLSAX.SET_SAX_EVENT_PROCEDURE
END_PROCEDURE

|INCL \script\util.lib
|INCL \script\xmlsax.mod
|INCL \script\run1.prg