IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAP Discussion :

[ABAP] Transformation XML -> ABAP data


Sujet :

SAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut [ABAP] Transformation XML -> ABAP data
    Bonjour à tous,

    Voilà plusieurs semaines que je suis bloquée sur un problème : je cherche à analyser un fichier XML par un programme ABAP, en utilisant un XSLT de transformation.
    Je lis le fichier XML et le stocke dans une variable STRING.
    J'ai définit une table interne pour accueillir les données contenues dans le fichier XML.
    J'ai défini un XSLT de transformation.
    J'utilise l'instruction CALL TRANSFORMATION ...

    J'ai trouvé divers exemples, mais aucun de fonctionne pour ma structure de fichier.

    Est-ce que quelqu'un peut m'aider ?
    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut ... suite
    Pour être plus claire, voici les différents bouts de code que j'utilise.
    Le fichier source XML que je veux analyser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?xml version="1.0" encoding="UTF-8"?>
    <Envelope type="Response">
    <Header>
    <From>Societe</From>         
                <To>Autre_societe</To>          
                <UseCase>Action</UseCase>     
                <SessionID>1</SessionID>   
                <Version>2.5</Version>     
                <Status>0</Status>      
                               
            </Header>
            
        <Body>
                
            <DeliveryInfo>
                    <Fileproceed>Yes</Fileproceed>         
                    <Reported>33</Reported>             
                    <BillerID>10000000000000001</BillerID>           
                    <TotalAmount>358.55</TotalAmount>        
                </DeliveryInfo><OK_Result>
                    <Proceed>33</Proceed>            
                    <TotalAmount_OK>358.55</TotalAmount_OK>       
                </OK_Result><NOK_Result>
                    <Not_Proceed>0</Not_Proceed>         
                    <TotalAmount_NOK>0.00</TotalAmount_NOK>    
                    
                </NOK_Result></Body></Envelope>
    Le fichier XSLT de transformation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl">
    
      <!--  Récupération du contenu du fichier XML  -->
      <xsl:template match="/">
        <xsl:copy>
          <xsl:apply-templates />
        </xsl:copy>
      </xsl:template>
    
      <!-- Appliquer les templates dès que la balise ENVELOPE est trouvée  -->
      <xsl:template match="Envelope">
        <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
          <asx:values>
            <Envelope>
              <xsl:apply-templates select="Body" />
            </Envelope>
          </asx:values>
        </asx:abap>
      </xsl:template>
    
      <!--  appliquer la template BODY pour en récupérer son contenu  -->
      <xsl:template match="Body">
        <Body>
          <xsl:apply-templates select="DeliveryInfo" />
          <xsl:apply-templates select="OK_Result" />
          <xsl:apply-templates select="NOK_Result" />
        </Body>
      </xsl:template>
    
      <!--  Récupération du contenu du bloc DELIVERYINFO  -->
      <!--  les labels sont en lien avec le nom de la colonne du tableau -->
      <!--  le mot-clef utilisé dans la clause select est en lien avec la balise du XML en train d'être lu  -->
      <xsl:template match="DeliveryInfo">
        <Fileprocced><xsl:value-of select="FILE_PROCEED" /></Fileproceed>
        <Reported><xsl:value-of select="REPORTED" /></Reported>
        <BillerID><xsl:value-of select="BILLER_ID" /></BillerID>
        <TotalAmount><xsl:value-of select="TOTAL_AMNT" /></TotalAmount>
      </xsl:template>
    
      <!--  Récupération du contenu du bloc OK_Result -->
      <xsl:template match="OK_Result">
        <Proceed><xsl:value-of select="PROCEED" /></Proceed>
        <TotalAmount_OK><xsl:value-of select="TOTAL_AMNT_OK" /></TotalAmount_OK>
      </xsl:template>
    
      <!--  Récupération du contenu du bloc NOK_RESULT -->
      <xsl:template match="NOK_Result">
        <Not_Proceed><xsl:value-of select="NOT_PROCEED" /></Not_Proceed>
        <TotalAmount_NOK><xsl:value-of select="TOTAL_AMNT_NOK" /></TotalAmount_NOK>
      </xsl:template>
    
    </xsl:transform>
    Et enfin, mon code ABAP qui est sensé faire le travail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    TYPES : BEGIN OF typ_xml, 
                file_proceed(3),                  
                reported           TYPE i,                    
                biller_id(17),                                
                total_amnt(17),                              
                proceed            TYPE i,                    
                total_amnt_ok(17),                            
                not_proceed        TYPE i,                  
                total_amnt_nok(17),                          
            END OF typ_xml. 
    
    DATA : gt_xml        TYPE STANDARD TABLE OF typ_xml, 
           gt_result     TYPE abap_trans_resbind_tab, 
           gs_xml        TYPE typ_xml, 
           gs_result     TYPE abap_trans_resbind. 
    
    DATA : gv_read_xml TYPE string.      
    
    (...) 
    * Ecran de sélection avec P_FILE = chemin complet du fichier XML
    
    start-of-selection. 
    
      OPEN DATASET p_file FOR INPUT IN BINARY MODE. 
      IF sy-subrc = 0. 
         CLEAR : gv_read_xml. 
         READ DATASET p_file INTO gv_read_xml. 
    
    *   Transformation XML en ABAP-DATA 
         PERFORM check_xml USING gv_read_xml. 
    
         CLOSE DATASET gv_file. 
      ENDIF. 
    
    *&---------------------------------------------------------------------* 
    *&      Form  check_xml 
    *&---------------------------------------------------------------------* 
    FORM check_xml  USING    p_xml TYPE string. 
    
      DATA: cx_runtime_error TYPE REF TO cx_xslt_runtime_error. 
      DATA: cx_format_error  TYPE REF TO cx_xslt_format_error. 
      DATA: err_text         TYPE string. 
    
      REFRESH : gt_result, gt_xml. 
      CLEAR : gs_result, gs_xml. 
      GET REFERENCE OF gt_xml INTO gs_result-value. 
      gs_result-name = 'Envelope'. 
      APPEND gs_result TO gt_result. 
    
      TRY. 
    
          CALL TRANSFORMATION ypmcl001_id 
               SOURCE XML p_xml 
               RESULT (gt_result). 
    
        CATCH cx_sy_conversion_base64. 
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid. 
          err_text = cx_runtime_error->get_text( ). 
          WRITE :/ 'text = ', err_text. 
        CATCH cx_sy_conv_illegal_date_time. 
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid. 
          err_text = cx_runtime_error->get_text( ). 
          WRITE :/ 'text = ', err_text. 
        CATCH cx_xslt_runtime_error INTO cx_runtime_error. 
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid. 
          err_text = cx_runtime_error->get_text( ). 
          WRITE :/ 'text = ', err_text. 
        CATCH cx_xslt_format_error INTO cx_format_error. 
          WRITE :/ 'kernel_errid = ', cx_format_error->kernel_errid. 
          err_text = cx_format_error->get_text( ). 
          WRITE :/ 'text = ', err_text. 
        CLEANUP. 
          WRITE :/ 'passage par cleanup'. 
    
      ENDTRY. 
    
    * Contrôle écran du résultat lu 
      LOOP AT gt_xml INTO gs_xml. 
        WRITE / gs_xml. 
      ENDLOOP. 
    
    ENDFORM.                    " check_xml
    Le problème est que je ne récupère rien dans la table GT_XML.
    Merci d'avance pour vos suggestions.

  3. #3
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut
    Bonsoir,
    Je n'ai pas eu le temps de verifier le code, je regarderai demain, mais y'a-t-il des donnees dans gt_result ?

    Ludo

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut
    Bonjour,

    Il n'y a que ce que j'y ai chargé :
    GT_RESULT-NAME contient Envelope
    GT_RESULT-VALUE contient {A:1}

  5. #5
    Membre chevronné

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Par défaut
    Bonjour,
    J'ai essayé ce morceau de code mais j'imagine que tu n'as pas fait un simple copié-collé : il ne compile pas. J'ai donc fait quelques modifications (v. ci-dessous), échangé l'appel au DATASET par un appel d'API (parceque je ne ne peux pas importer le fichier XML sur le serveur). Mais j'ai un xslt kernel error : hélas. En outre, je ne vois pas trop pourquoi tu utilises deux tables ?!?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TYPES : BEGIN OF abap_trans_resbind,
             name    TYPE STRING,
             BEGIN OF value,
              INCLUDE TYPE typ_xml,
             END OF value,
            END OF abap_trans_resbind.
    Et aussi la transformation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          CALL TRANSFORMATION ypmcl001_id
               SOURCE XML p_xml
               RESULT para = gt_xml.
    De là, j'ai aussi modifié une balise du fichier XSLT pour compiler.

    Par contre, j'aimerais avoir un feedback sur ces modifs avant de poursuivre et/ou un code compilable.

    Amicalement,
    Ludo

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut Nouvelle donne
    Bonjour Ludovic,

    Mon code n'était effectivement pas un copier/coller et je ne l'avais pas fait fonctionner tel que, désolée
    Depuis mon dernier post, j'ai fait quelques modifications pour essayer de m'en sortir ... le résultat n'est pas mieux, mais je te donne les dernières sources.

    Merci pour ta réponse en tous cas, ça m'encourage de savoir que quelqu'un est là

    Nouveau XSLT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl" version="1.0">
    
      <xsl:template match="/">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="Envelope">
        <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
          <asx:values>
            <PEOPLE>
              <xsl:apply-templates/>
            </PEOPLE>
          </asx:values>
        </asx:abap>
      </xsl:template>
    
      <xsl:template match="Header"/>
    
      <xsl:template match="Body">
        <item>
          <xsl:apply-templates select="DeliveryInfo/item"/>
          <xsl:apply-templates select="OK_Result/item"/>
          <xsl:apply-templates select="NOK_Result"/>
         </item>
     </xsl:template>
    
      <xsl:template match="DeliveryInfo">
        <item>
        <Fileproceed>     <xsl:value-of select="fileproceed"/>    </Fileproceed>
        <Reported>        <xsl:value-of select="REPORTED"/>       </Reported>
        <BillerID>        <xsl:value-of select="BILLERID"/>       </BillerID>
        <TotalAmount>     <xsl:value-of select="TOTALAMOUNT"/>    </TotalAmount>
        </item>
      </xsl:template>
    
      <xsl:template match="OK_Result">
        <item>
        <Proceed>        <xsl:value-of select="proceed"/>         </Proceed>
        <TotalAmount>    <xsl:value-of select="totalamount"/>     </TotalAmount>
        </item>
      </xsl:template>
    
      <xsl:template match="NOK_Result"/>
    
    </xsl:transform>
    Nouveau Code pour le programme :
    (J'ai mis en rouge les lignes qui manquaient pour que ça compile le coup d'avant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    TYPE-POOLS : abap.
    
    TYPES : BEGIN OF typ_xml,
                file_proceed(3),
                reported           TYPE i,
                biller_id(17),
                total_amnt(17),
                proceed            TYPE i,
                total_amnt_ok(17),
                not_proceed        TYPE i,
                total_amnt_nok(17),
            END OF typ_xml.
    
    DATA : gt_xml        TYPE STANDARD TABLE OF typ_xml,
              gt_result     TYPE abap_trans_resbind_tab,
              gs_xml        TYPE typ_xml,
             gs_result     TYPE abap_trans_resbind.
    
    DATA : gv_read_xml TYPE string.
    
    * Ecran de sélection avec
    PARAMETER p_file(200) DEFAULT
              '\\b116b\transfert\sig_20050701203812_back.xml'.
    
    START-OF-SELECTION.
    
      OPEN DATASET p_file FOR INPUT IN BINARY MODE.
      IF sy-subrc = 0.
        CLEAR : gv_read_xml.
        READ DATASET p_file INTO gv_read_xml.
    
    *   Transformation XML en ABAP-DATA
        PERFORM check_xml USING gv_read_xml.
    
        CLOSE DATASET p_file.
      ENDIF.
    
    *&---------------------------------------------------------------------*
    
    *&      Form  check_xml
    *&---------------------------------------------------------------------*
    
    FORM check_xml  USING    p_xml TYPE string.
    
    * Référence aux objets d'exception
      DATA: cx_runtime_error TYPE REF TO cx_xslt_runtime_error.
      DATA: cx_format_error  TYPE REF TO cx_xslt_format_error.
      DATA: err_text         TYPE string.
    
      TYPES: BEGIN OF t_dev_inf,
               fileproceed(3),
               reported TYPE i,
               billerid(17),
             END OF t_dev_inf,
    
             begin of t_ok,
               proceed type i,
               totalamount type p,
             end of t_ok,
    
             BEGIN OF t_people,
                deliveryInfo type t_dev_inf,
                ok_result    type t_ok,
             END OF t_people.
    
      DATA: people_itab   TYPE STANDARD TABLE OF t_people,
            wa_people     TYPE t_people,
            source_xml    TYPE string,
            result_xml    TYPE abap_trans_resbind_tab,
            wa_result_xml TYPE abap_trans_resbind,
            lv_xml_tmp    TYPE string.
    
      GET REFERENCE OF people_itab INTO wa_result_xml-value.
      wa_result_xml-name = 'PEOPLE'.
      APPEND wa_result_xml TO result_xml.
    
      TRY.
    
          CALL TRANSFORMATION ypmcl001_id
          SOURCE XML p_xml
          RESULT (result_xml).
    
        CATCH cx_sy_conversion_base64.
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
          err_text = cx_runtime_error->get_text( ).
          WRITE :/ 'text = ', err_text.
        CATCH cx_sy_conv_illegal_date_time.
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
          err_text = cx_runtime_error->get_text( ).
          WRITE :/ 'text = ', err_text.
        CATCH cx_xslt_runtime_error INTO cx_runtime_error.
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
          err_text = cx_runtime_error->get_text( ).
          WRITE :/ 'text = ', err_text.
        CATCH cx_xslt_format_error INTO cx_format_error.
          WRITE :/ 'kernel_errid = ', cx_format_error->kernel_errid.
          err_text = cx_format_error->get_text( ).
          WRITE :/ 'text = ', err_text.
        CLEANUP.
          WRITE :/ 'passage par cleanup'.
    
      ENDTRY.
    
      LOOP AT people_itab INTO wa_people.
    *    WRITE: / sy-tabix, wa_people-deliveryinfo-fileproceed.
      ENDLOOP.
    
    ENDFORM.                    " check_xml

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. creation d'un xml en abap
    Par cybercrisp dans le forum SAP
    Réponses: 1
    Dernier message: 22/02/2008, 08h59
  2. [ABAP] Transformation XML - ABAP via XSLT
    Par Pat_lyon dans le forum SAP
    Réponses: 5
    Dernier message: 06/12/2007, 11h46
  3. [Data Island] Transformation Xml
    Par shinux2004 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 05/07/2005, 14h20
  4. Transformation xml + xsl -> HTML via PHP
    Par petit-ourson dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/10/2003, 22h42
  5. Pd de transformation XML/XSL sur un windows 2000 server US
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 3
    Dernier message: 24/03/2003, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo