Xml - Abap

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • claudioconiberti
    Junior Member
    • jul
    • 2

    #1

    Xml - Abap

    Buen día a todos, les escribía para pedir ayuda respecto a como levantar un archivo ".xml" desde abap de modo tal de insertar los datos en una tabla interna. Desde ya muchas gracias por su colaboración. Saludos Cordiales.

    Claudio
  • Tonnyman
    Member
    • dic
    • 53

    #2
    Haber, encontré este ejemplo en internet, lo he testeado y si funciona. Ojalá pueda ayudartre con eso.

    Crea tu archivo con extensión XML.

    <?xml version="1.0" encoding="iso-8859-1" ?>
    - <CUSTOMERS>
    - <PERSON>
    <customer_id>1</customer_id>
    <first_name>Jan</first_name>
    <last_name>Krohn</last_name>
    </PERSON>
    - <PERSON>
    <customer_id>2</customer_id>
    <first_name>James</first_name>
    <last_name>Kirk</last_name>
    </PERSON>
    </CUSTOMERS>

    Este es el Codigo ABAP que se necesita.

    REPORT ZTT.

    TYPE-POOLS abap.

    CONSTANTS gs_file TYPE string VALUE 'C:\customers.xml'.

    * This is the structure for the data from the XML file

    TYPES: BEGIN OF ts_person,
    cust_id(4) TYPE n,
    firstname(20) TYPE c,
    lastname(20) TYPE c,
    END OF ts_person.

    * Table for the XML content

    DATA: gt_itab TYPE STANDARD TABLE OF char2048.

    * Table and work ares for the data from the XML file

    DATA: gt_person TYPE STANDARD TABLE OF ts_person,
    gs_person TYPE ts_person.

    * Result table that contains references
    * of the internal tables to be filled

    DATA: gt_result_xml TYPE abap_trans_resbind_tab,
    gs_result_xml TYPE abap_trans_resbind.

    * For error handling

    DATA: gs_rif_ex TYPE REF TO cx_root,
    gs_var_text TYPE string.

    * Get the XML file from your client

    CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
    filename = gs_file
    CHANGING
    data_tab = gt_itab
    EXCEPTIONS
    file_open_error = 1
    file_read_error = 2
    no_batch = 3
    gui_refuse_filetransfer = 4
    invalid_type = 5
    no_authority = 6
    unknown_error = 7
    bad_data_format = 8
    header_not_allowed = 9
    separator_not_allowed = 10
    header_too_long = 11
    unknown_dp_error = 12
    access_denied = 13
    dp_out_of_memory = 14
    disk_full = 15
    dp_timeout = 16
    not_supported_by_gui = 17
    error_no_gui = 18
    OTHERS = 19.

    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    * Fill the result table with a reference to the data table.
    * Within the XSLT stylesheet, the data table can be accessed with
    * "IPERSON".

    GET REFERENCE OF gt_person INTO gs_result_xml-value.
    gs_result_xml-name = 'IPERSON'.
    APPEND gs_result_xml TO gt_result_xml.

    * Perform the XSLT stylesheet

    TRY.

    CALL TRANSFORMATION z_xml_to_abap
    SOURCE XML gt_itab
    RESULT (gt_result_xml).

    CATCH cx_root INTO gs_rif_ex.

    gs_var_text = gs_rif_ex->get_text( ).
    MESSAGE gs_var_text TYPE 'E'.

    ENDTRY.

    * Now let's see what we got from the file

    LOOP AT gt_person INTO gs_person.
    WRITE: / 'Customer ID:', gs_person-cust_id.
    WRITE: / 'First name :', gs_person-firstname.
    WRITE: / 'Last name :', gs_person-lastname.
    WRITE : /.
    ENDLOOP. "gt_person.

    Ten presente de que antes de que actives el programa deberas crear el XSLT y eso lo haras haciendo doble clic en la linea del "CALL TRANSFORMATION z_xml_to_abap", seleccionas XSLT y luego pegas el XSLT debajo.

    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xslutput encoding="iso-8859-1" indent="yes" method="xml" version="1.0"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
    <asx:values>
    <IPERSON>
    <xsl:apply-templates select="//PERSON"/>
    </IPERSON>
    </asx:values>
    </asx:abap>
    </xsl:template>

    <xsl:template match="PERSON">
    <item>
    <CUST_ID>
    <xsl:value-of select="customer_id"/>
    </CUST_ID>
    <FIRSTNAME>
    <xsl:value-of select="first_name"/>
    </FIRSTNAME>
    <LASTNAME>
    <xsl:value-of select="last_name"/>
    </LASTNAME>
    </item>
    </xsl:template>

    </xsl:transform>

    Activas el programa y debe funcionar.

    Espero haberte podido ayudar.

    Saludos.

    Comentario

    Trabajando...