XML-Datei mit Simple Transformation einlesen

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
Hallo,

versuche gerade eine XML-Datei in ABAP einzulesen, habe aber ein kleines Problem, mache es mit Simple Transformation.

Nun meine Frage, wie stelle ich es mit ST an, eine verschachtelte Struktur einzulesen?
Soll bedeuten YEX_PROBLEM kommt mehrmals vor, aber wie soll ich das in der Transformation anstellen?
Ausßerdem kann ich Zeile 2 und 3 auch nicht lesen, muss sie erst löschen, um zumindest eine YEX_PROBLEM einlesen zu können und keinen Fehler zu bekommen?
Woran liegt das?

<?xml version="1.0" encoding="utf-8" ?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<EXTRACT>
<YEX_PROBLEM>
......
</YEX_PROBLEM>
<YEX_PROBLEM>
............
</YEX_PROBLEM>
</EXTRACT>
</asx:values>
</asx:abap >

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
Hallo ich bins wieder,

ich denke mal das dies ziemlich umfangreich ist, da ich eine 5-fach verschachtelte Struktur schon habe.

Wäre es vielleicht mit XSL-Transformation leichter?

Kenne mich aber mit dem gar nicht aus. Hat jemand vielleicht ein einfaches Beispielprogramm, mit einer Verschachtelten Struktur, bin noch ein Anfänger in Sachen ABAP, damit ich das Mal nachvollziehen könnte. Benötige nur die Deserialisierung, habe den Code schon in einen String eingelesen, aber wie ziehe ich nun die Daten raus?

Bitte um Hilfe.

MfG Tom

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von Azreal (Specialist / 182 / 1 / 0 ) »
Hallo Tom,
dazu fällt mir ein iXML - wie groß ist denn dein XML?
wie ich dich verstanden habe möchtest du alle daten aus dem XML in deine eigenen Tabellen usw einspielen, richtig?

Ich habe gerade keinen Systemzugriff - aber anbei eine kurze Einführung zum XML parsen:
http://help.sap.com/saphelp_nw04/helpda ... ontent.htm
und die gesamte übersicht:
http://help.sap.com/saphelp_nw04/helpda ... ontent.htm

Melde mich, sobald ich Systemzugriff habe :D bis dahin :up:

Gruß Aze

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
Hallo,

ja ich will die ganze Datei in eine interne Tabelle einlesen. Das Problem ist aber, dass die unteren Strukturen wie Struc_YEX_Problem oder STRUC_YEX_ARBEITSAUFTRAG öfters vorkommen können.
Ich weiß jetz, dass es mit einer Simple Transformation hinhaut:

Call Transformation ID
source XML xml_str
Result struc_extract = result.

mein Problem ist jetz aber, dass ich Tabellen in Tabellen dafür benötige, wie stelle ich das bei dieser Struktur an?


mfg Tom

Hier die Struktur:
Zuletzt geändert von tom1986 am 11.02.2009 16:05, insgesamt 1-mal geändert.

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von Azreal (Specialist / 182 / 1 / 0 ) »
Nunja - habe damals Tabellentypen angelegt und dann mittels include eingebunden.

Code: Alles auswählen.

  types:
    begin of TY_Kopf,
      ID type whatever,
      include type spfli as Positionen.
    types: end of TY_Kopf .
ps.: zur XML Transformation - ein guter Link ist: https://www.sdn.sap.com/irj/scn/weblogs ... b/wlg/2657

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
Hallo,

also es geht definitiv mit call Transformation, das steht fest, es muss halt die Struktur des XML-Files mit dem der Tabellen übereinstimmen.


mfg Tom

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
Also es hat jetz wunderbar geklappt und ich habe die Daten der XML jetzt in meiner Struktur nun aber das nächste Problem, die Struktur ist so mit Tabellen und zeugs verschachtelt, dass ich nicht mehr weiß, wie ich die Daten rauslesen kann. Kann mir jemand mal so ein beispiel zeigen mit vielen verschachtelten Tabellen, weil ich hab nichts gefunden?

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von horst1959 (ForumUser / 20 / 0 / 0 ) »
Hallo
Einfach alles der Reihe nach einlesen und dann in eine Tabelle, wäre das eine Lösung?

Resulttabelle :
***********************************************************************************************

Code: Alles auswählen.

    types : begin of ty_res,
             indent        type i,
             element(64)   type c,
             attribute(64) type c,
             value(512)    type c,
            end of ty_res.

    data : ta_result type table of ty_res,
           wa_result type ty_res.
Diese Tabelle enthält dann alle Werte. Mit einem Loop in eine Struktur bringen, sollte dann sicher ohne Hilfe möglich sein

Caller
**********************************************************************************************

Code: Alles auswählen.

    call method o_xmlparser->simpel_parse
        exporting
          p_table = itab_xml
          p_lang  = xml_table_size
        importing
          p_tab   = ta_result
          p_error = proxy_error.

Parser
*********************************************************************************************

Code: Alles auswählen.


*----------------------------------------------------------------------*
*       CLASS cl_xmlparser DEFINITION
*----------------------------------------------------------------------*

class cl_xmlparser definition inheriting from cl_xmlproxy.
*
  public section.

**** System
*
    class-methods class_constructor.
*
    methods : constructor.

**** Offene
*
*-Error
    types : begin of ty_error,
              count       type i,
              line        type i,
              column      type i,
              reason(512) type c,
             end of ty_error.
    types : ty_errortab type standard table of ty_error.
    data :  ta_error type ty_errortab,  " Tabelle
            wa_error type ty_error.     " Struktur

*-Return-Table
    types : begin of ty_res,
             indent        type i,
             element(64)   type c,
             attribute(64) type c,
             value(512)    type c,
            end of ty_res.
    types : ty_result type standard table of ty_res.
    data : ta_table type ty_result,   " Tabelle
           wa_table type ty_res.      " Struktur
*
    methods : simpel_parse importing p_table type ty_xmltab
                                     p_lang  type i          optional
                                     p_validate type boolean optional
                           exporting p_tab   type ty_result
                                     p_error like sy-subrc.

**** Privat
*
  private section.
*
    data : l_parser          type ref to if_ixml_parser,
           l_istream         type ref to if_ixml_istream,
           l_node            type ref to if_ixml_node,
           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,
           l_root_node       type ref to if_ixml_node,
           l_next_node       type ref to if_ixml_node,
           l_iterator        type ref to if_ixml_node_iterator.

    data : l_xmldata         type string.

    data : l_name            type string,
           name              type string,
           prefix            type string,
           value             type string,
           indent            type i,
           count             type i,
           index             type i.

*
    methods : size importing proxy_table type ty_xmltab
                   returning value(l_xml_size) type i.

*
endclass.                                       "cl_xmlparser DEFINITION

*----------------------------------------------------------------------*
*       CLASS cl_xmlparser IMPLEMENTATION
*----------------------------------------------------------------------*

class cl_xmlparser implementation.

**** System
  method class_constructor.
  endmethod.                                          "class_constructor
*
  method constructor.
    call method super->constructor.
    refresh : ta_table, ta_error.
    clear   : wa_table, wa_error.
  endmethod.                                                "constructor

**** Privat
*
  method size.

    constants : offset type i value 2.

    data : l_xml_wa          type ty_xml.

    field-symbols: <fs> type any.

    clear l_xmldata .

    loop at proxy_table into l_xml_wa.
      assign l_xml_wa to <fs> casting type c.
      concatenate l_xmldata  <fs> into l_xmldata .
    endloop.

    l_xml_size = strlen( l_xmldata  ) + offset.

    clear l_xmldata .

  endmethod.                                                       "size

**** Offene
*
  method simpel_parse.
*
    define upchar.
      translate &1 to upper case.
    end-of-definition.
*
    clear p_error.

*-Size of document
    if not p_lang is initial.
      l_xml_size = p_lang.
    else.
      l_xml_size = me->size( proxy_table = p_table ).
    endif.
    check l_xml_size > 0.

*-Creating the main iXML factory
    l_ixml = cl_ixml=>create( ).

*-Creating a stream factory
    l_streamfactory = l_ixml->create_stream_factory( ).

*-wrap the table containing the file into a stream
    l_istream = l_streamfactory->create_istream_itable( table =
                p_table size  = l_xml_size ).

*-Creating a document
    l_document = l_ixml->create_document( ).

*-Create a Parser
    l_parser = l_ixml->create_parser( stream_factory = l_streamfactory
                                      istream        = l_istream
                                      document       = l_document ).

*-Validate a document - Optional
    if p_validate = true.
      l_parser->set_validating( mode = if_ixml_parser=>co_validate ).
    endif.

*-Parse the stream
    if l_parser->parse( ) ne 0.

      if l_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.

        clear wa_error.
        count = l_parser->num_errors( ).
        wa_error-count = count.
        index = 0.

        while index < count.
          parseerror = l_parser->get_error( index = index ).
          i = parseerror->get_line( ).
          wa_error-line = i.
          i = parseerror->get_column( ).
          wa_error-column = i.
          str = parseerror->get_reason( ).
          wa_error-reason = str+0(512).
          index = index + 1.
        endwhile.

      endif.

    endif.

*-Process the document
    if l_parser->is_dom_generating( ) eq true.

*-PERFORM process_dom USING l_document.
      node ?= l_document.

      check not node is initial.
      clear wa_table.

      if node is initial.
        exit.
      endif.

*-create a node iterator
      iterator  = node->create_iterator( ).

*-get current node
      node = iterator->get_next( ).

*-loop over all nodes
      while not node is initial.

        if wa_table-indent is initial.
          wa_table-indent = node->get_height( ).
        endif.

        case node->get_type( ).
          when if_ixml_node=>co_node_element.
*-element node
            name    = node->get_name( ).
            nodemap = node->get_attributes( ).

            wa_table-element = name.
            upchar wa_table-element.

            if not nodemap is initial.
*-attributes
              count = nodemap->get_length( ).

              do count times.
                index  = sy-index - 1.
                attr   = nodemap->get_item( index ).
                name   = attr->get_name( ).
                prefix = attr->get_namespace_prefix( ).
                value  = attr->get_value( ).
                wa_table-attribute = name.
                upchar wa_table-attribute.
                wa_table-value = value.
              enddo.

            endif.

          when if_ixml_node=>co_node_text or
               if_ixml_node=>co_node_cdata_section.
*-text node
            value  = node->get_value( ).
            wa_table-value = value.
        endcase.

*-advance to next node
        if not wa_table-value is initial.
          append wa_table to ta_table.
          clear wa_table.
        endif.
        node = iterator->get_next( ).

      endwhile.

    endif.

    if ta_error[] is initial.
      p_tab[] = ta_table[].
    else.
      p_error = '1'.
      refresh p_tab.
    endif.
    free ta_table.

  endmethod.                                               "simpel_parse

endclass.                                   "cl_xmlparser IMPLEMENTATION

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
danke horst, aber ich habe die Daten schon, es ist aber jetzt ein ganz anderes Problem, wie ich die Daten aus der erstellten Struktur bekomme.

ich habe 5 Tabellen.

Tabelle root
Tabelle parent1 und parent2
Tabelle child 1 und child 2

Tabelle root hat attribute und tabelle parent 1 und parent 2
Tabelle parent1 hat wiederum auch attribute und tabelle 1 und tabelle 2
Ich habe nun die Daten in diese struktur eingelesen. Die Struktur heißt result, aber wie zum Teufel bekomme ich jetz die Daten da wieder raus, weil ich kann weder ein Feld so ansprechen z.B.: result-parent1-child1-nr noch über ein loop weil entweder was von einer flachen Struktur kommt oder die variable beim into passt ihm nicht.

Weiß jemand was?

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von horst1959 (ForumUser / 20 / 0 / 0 ) »
Sieh dir mal an, was Du als Antworttabelle bekommen würdest

Da kann mann über die Strukturtiefe auch eine MARD - Tabelle mit mehrenen Werken vollständig darstellen. Man muss es sich einfach nur mal ansehen.

teil a werk1
werk2
werk3

1 matnr ... 111
2 werks 0001
....
2 werks 0002
...
2 werks....

;-))

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
mir ist schon bewusst, was für eine riesige interne Tabelle daraus entsteht, da es auf 50 Steinen XML waren und ich insgesamt 50 attribute habe und in dieser internen Tabelle wiederum 5 Tabellen liegen, wie aber spreche ich da nun die Felder an und wie in einer loop-schleife?

mfg tom

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von horst1959 (ForumUser / 20 / 0 / 0 ) »
Also, der simple_parser aus der gezeigten Klasse wird aus dem ganzen Gerühr eine einfache Tabelle machen in etwa so

1 matnr 1111
2 werks 0001
3 lgort 000
3 lgpro 000
2 werks 0002
3
3
2 werks 0003
3
3
-> umsetzen in horizontal

matnr werks lgort lgpro
111 0001 0000 0000
111 0002 0000 0000
111 0003 0000 0000
112
.....
das kann ich über einen loop erreichen.

case element.
when 'MATNR'.
my_structure-matnr = wa_result-value.
when 'WERKS'.

when ....
when others.
endcase.

append an neue tabelle ohne refresh!!!!

endloop.

Wenn der Rest der INHERIT - Geschichten Probleme macht, melde Dich einfach noch mal.
Also wenn Du die Klasse cl_xmlparser mal testen magst, tu es und wenn Du das Ergebniss sehen wirst, wird sicher klar sein, was ich meine.

Du musst Du nur noch in diesem loop eine Vertikale in eine horizontale Struktur umsetzen.

Gruß

HK

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von tom1986 (ForumUser / 38 / 0 / 0 ) »
Danke dir,

hat super geklappt.

mfg

tom

Re: XML-Datei mit Simple Transformation einlesen

Beitrag von horst1959 (ForumUser / 20 / 0 / 0 ) »
Sag ich doch, das ist am Ende so simpel. Man muss es nur mal sehen und schon weiß man, was es ist. Da muss nix mehr von XLST und all dem sein. Ein wenig Nachdenken und gut.

Freut mich, wenn es funktioniert

Gruß HK

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1574
Views
simple transformation
von akgermain » 13.12.2012 14:19 • Verfasst in ABAP® für Anfänger
0
Antw.
1038
Views
XML Simple transformation
von akgermain » 27.08.2013 17:39 • Verfasst in ABAP® für Anfänger
4
Antw.
2822
Views
Simple Transformation
von generic_user » 15.06.2016 12:40 • Verfasst in ABAP® Core
7
Antw.
6397
Views
XSLT SIMPLE Transformation
von Prego » 19.04.2010 12:16 • Verfasst in ABAP® Core
1
Antw.
3693
Views
SEPA Simple transformation
von akgermain » 12.12.2012 13:59 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 5 Stunden von DeathAndPain gelöst 22 / 2799
Daten an Tabelle binden
vor 10 Stunden von Lukas Sanders 2 / 875
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 430

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 5 Stunden von DeathAndPain gelöst 22 / 2799
Daten an Tabelle binden
vor 10 Stunden von Lukas Sanders 2 / 875
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 430

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2467
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9050