XML lesen mit ABAP
From Sapwiki
Inhaltsverzeichnis |
Allgemein
Um XML Dokumente in ABAP zu parsen (bzw. zu lesen) kann man die iXML-Bibliothek benutzen.
Methoden
Diese bietet zwei Formen zum XML Parsen:
- DOM (Baumstruktur Basiert)
- SAX (Eventbasiert)
SAX hat den Vorteil, das es speichersparend und sehr schnell arbeitet. DOM ist allerdings einfach auf komplexen Dokumenten anzuwenden.
Beispiel DOM
Die zu parsende XML Datei sieht so aus (am besten den Quelltext angucken) :
<root id="10"> <room id="1"> <room_name>F5.21</room_name> <room_type>Trainingroom</room_type> <seats>30</seats> <computer>15</computer> <room_description>Referenten PC</room_description> </room> <room id="2"> <room_name>F5.08</room_name> <room_type>Meetingroom</room_type> <seats>20</seats> <computer>1</computer> <room_description>Referenten- PC</room_description> </room> </root>
Erstellen des iXML Objektes:
DATA: l_ixml_factory TYPE REF TO if_ixml,
l_ixml_stream_factory TYPE REF TO if_ixml_stream_factory,
l_ixml_istream TYPE REF TO if_ixml_istream,
l_ixml_document TYPE REF TO if_ixml_document,
l_ixml_parser TYPE REF TO if_ixml_parser,
l_ixml_parser_event TYPE REF TO if_ixml_event,
l_ixml_parser_events TYPE i.
l_ixml_factory = cl_ixml=>create( ). " create new iXML factory
l_ixml_stream_factory = l_ixml_factory->create_stream_factory( ). " create new stream factory
l_ixml_istream = l_ixml_stream_factory->create_istream_string( string = lv_xml ).
l_ixml_document = l_ixml_factory->create_document( ). " create new document
l_ixml_parser = l_ixml_factory->create_parser( stream_factory = l_ixml_stream_factory
istream = l_ixml_istream document = l_ixml_document ). " connect all with a parser
Stream parsen (mit Fehlerbehandlung):
IF l_ixml_parser->parse( ) NE 0.
IF l_ixml_parser->num_errors( ) NE 0.
DATA: parseerror TYPE REF TO if_ixml_parse_error,
str TYPE string,
i TYPE i,
count TYPE i,
index TYPE i.
count = l_ixml_parser->num_errors( ).
WRITE: count, ' parse errors have occured:'.
index = 0.
WHILE index < count.
parseerror = l_ixml_parser->get_error( index = index ).
i = parseerror->get_line( ).
WRITE: 'line: ', i.
i = parseerror->get_column( ).
WRITE: 'column: ', i.
str = parseerror->get_reason( ).
WRITE: str.
index = index + 1.
ENDWHILE.
ENDIF.
ENDIF.
Hinweis: Hier wird auch gepr�ft, ob das XML File fehlerhaft ist.
Wenn "Ja" wird eine Fehlermeldung ausgegeben.
Vorsicht: Es gelten die XML Conventionen nach dem W3C Standart.
Z.b. darf man keine "&" oder "<" in Elementinhalten oder Attributen nutzen.
In solchen F�llen muss man, wie bei HTML, "&" durch "&" ersetzen.
Verarbeiten des DOM Documents:
DATA: node TYPE REF TO if_ixml_node,
iterator TYPE REF TO if_ixml_node_iterator,
nodemap TYPE REF TO if_ixml_named_node_map,
attr TYPE REF TO if_ixml_node,
name TYPE string,
prefix TYPE string,
value TYPE string,
ls_room TYPE ztest_s_room.
IF l_ixml_document IS INITIAL.
EXIT.
ENDIF.
WHILE NOT node IS INITIAL.
CASE node->get_name( ). " Bekommt den Element name (root,room,room_name,room_type...)
WHEN 'root'.
WHEN 'room'.
node = iterator->get_next( ). " Springt zum n�chsten Element: Beim ersten durchlauf zu room_name
DO.
CASE. node->get_name( ).
WHEN 'room_name'.
ls_room-room_name = node->get_value( ).
WHEN 'seats'.
ls_room-seats = node->get_value( ).
...
WHEN 'room_description'.
ls_room-room_description = node->get_value( ).
" Letztes element also Schleife verlassen.
exit.
ENDCASE.
ENDDO.
ENDCASE.
node = iterator->get_next( ). " Springt zum n�chsten Element
ENDWHILE.

