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.
Folgende Parameter können in der Map
XMLSAX_PARAM
gesetzt werden:
Parameter | req/opt | Beschreibung |
STATISTICS | o | ON oder OFF .
Objektstatistik am Ende der .log Datei ausgeben. |
ELEMENT_LEVEL | o | <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_LEVEL | o | <level> oder OFF. Bis zu
welcher Verschachtelungstiefe (Level) Informationen zu
Parentelementen eines Elementes geliefert werden
sollen. |
Der Modul XMLSAX liefert pro IN-Objekt folgende Systemkomponenten:
Komponenten | req/opt | Beschreibung |
IN.XML_LINE(i) | r | Zeilennummer der aktuellen Elementes |
IN.XML_COLUMN(i) | r | Kolonnennummer des aktuellen Elementes |
IN.XML_LEVEL(i) | r | Verschachtelungstiefe (Level) des aktuellen Elementes |
IN.XML_ELEMENT_LEVEL_*(s) | o | Namen der Parentelemente pro Verschachtelungstiefe
(Level) des aktuellen Elementes. Nur wenn Parameter
ELEMENT_PARENT_INFO_LEVEL gesetzt
ist. |
IN.XML_ELEMENT_PARENT(s) | r | Namen des Parentelementes des aktuellen Elementes |
IN.XML_ELEMENT(s) | r | Namen des aktuellen Elementes |
IN.DATA(s) | o | Den Datenwert des aktuellen Elementes. |
IN.<attribut>(s) | o | Attribute des aktuellen Elementes. Der Wert ist immer ein String. |
IN.<element>(m|li) | o | Childelemente 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. |
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.
Komponenten | req/opt | Beschreibung |
IN.XML_LINE(i) | r | Zeilennummer des aktuellen Events |
IN.XML_COLUMN(i) | r | Kolonnennummer des aktuellen Events |
IN.XML_LEVEL(i) | r | Verschachtelungstiefe (Level) des aktuellen Events |
IN.XML_SAXEVENT(s) | r | Name des aktuellen Events. Unterstützt werden zur
Zeit die Events startElement ,
endElement ,
characters . |
IN.XML_ELEMENT(s) | o | Namen des aktuellen Elementes. Nur wenn ein Element
am Ereignis beteiligt ist. Beispiel Ereignis
startElement ,
endElement |
IN.<attribut>(s) | o | Attribute des aktuellen Elementes. Nur wenn das
aktuelle Element des Ereignisses Attribute aufweist.
Beispiel Ereignis startElement . |
IN.DATA(s) | o | Den 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
.
Prozedur | XLMSAX_OPEN ! [s input][] |
Beschreibung | Öffnet die XML-Datei
<input> . Die Prozedur wird von RUN1
automatisch aufgerufen. |
Beispiel |
|
Prozedur | XMLSAX_READ_OBJECT ! [][b state] |
Beschreibung | Liest das nächste Objekt
aus der aktuellen XML-Datei. Das Objekt wird in der MAP
|
Beispiel |
|
Prozedur | XMLSAX_CLOSE ! [][] |
Beschreibung | Schliesst den Modul und gibt die durch den Modul belegten Resourcen wieder frei. Die Prozedur wird von RUN1 automatisch aufgerufen. |
Beispiel |
|
Prozedur | XMLSAX.SET_SAX_EVENT_PROCEDURE ! [* procedure][] |
Beschreibung | Definiert 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 |
|
Prozedur | XMLSAX.FILE_IS_VALID ! [s file][b status] |
Beschreibung | Test 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 |
|
! 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