XML lesen mit ABAP

From Sapwiki

Jump to: navigation, search

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.

N�tzliche Links

Persönliche Werkzeuge