• 20170401 错了两天的-XML解析


    你不找到的话,错误就在那里。你找到了错误才会成为财富!

    Strans XML 解析3要素:
    1.源xml 格式正常,

    eg.

    '<?xml version="1.0" encoding="UTF-8"?>'
    
    '<handleIMatnrResourceServiceResponse><out>'
    '<MLMatnrResource>
    <backup1/>
    <backup2/>
    <backup3/>
    <backup4/>
    <backup5/>
    <ebeln>4800064316</ebeln>
    <ebelp>00010</ebelp>
    <lifnrAmount/>
    <maktx>A级冰箱型号标贴_C0414.6-1(A</maktx>'
    '<matnr>000000000800013563</matnr>
    <proAmount/>
    <storeAmount>12.0</storeAmount>
    
    </MLMatnrResource>'
    '</out></handleIMatnrResourceServiceResponse>' 
    

      

    2.XML 解析例程可用,

    判断方法:

    a.code pass,

    b.节点正确,

    3.检查表结构对应是否OK,

    用这个 以图 片方式编辑简单转换 ---正确和错误的对比没差别,这个方式作用不大!

    Debug 进去比对源结构和程序结构是否对应,可以检查结构问题

    <?sap.transform simple?>
    <tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
    
      <tt:root name="MLMatnrResource"/>
      <tt:template>
        <handleIMatnrResourceServiceResponse>
          <out>
            <tt:loop name="out" ref=".MLMatnrResource">
              <MLMatnrResource>
    
                <backup1>
                  <tt:value ref="$ref.backup1"/>
                </backup1>
                <backup2>
                  <tt:value ref="$ref.backup2"/>
                </backup2>
                <backup3>
                  <tt:value ref="$ref.backup3"/>
                </backup3>
                <backup4>
                  <tt:value ref="$ref.backup4"/>
                </backup4>
                <backup5>
                  <tt:value ref="$ref.backup5"/>
                </backup5>
    
                <ebeln>
                  <tt:value ref="$ref.ebeln"/>
                </ebeln>
                <ebelp>
                  <tt:value ref="$ref.ebelp"/>
                </ebelp>
                <lifnrAmount>
                  <tt:value ref="$ref.lifnrAmount"/>
                </lifnrAmount>
                <maktx>
                  <tt:value ref="$ref.maktx"/>
                </maktx>
                <matnr>
                  <tt:value ref="$ref.matnr"/>
                </matnr>
                <proAmount>
                  <tt:value ref="$ref.proAmount"/>
                </proAmount>
                <storeAmount>
                  <tt:value ref="$ref.storeAmount"/>
                </storeAmount>
              </MLMatnrResource>
            </tt:loop>
          </out>
        </handleIMatnrResourceServiceResponse>
      </tt:template>
    
    </tt:transform>
    

      

    3.RETURN 内表定义要与源数据表 匹配!

    实例证明,表结构不对应,解析不了,

     CALL TRANSFORMATION  ZML_XML_TRANS02"ZML_XML_RESOURCE
            SOURCE XML Z_OUT-RETURN_DATA
            RESULT MLMATNRRESOURCE =  GT_RE.
    FUNCTION ZMLSCP1_FR0008.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     VALUE(I_EBELN) TYPE  EBELN OPTIONAL
    *"     VALUE(I_MATNR) TYPE  MATNR OPTIONAL
    *"  EXPORTING
    *"     VALUE(O_STATU) TYPE  CHAR1
    *"     VALUE(O_MSG) TYPE  CHAR255
    *"  TABLES
    *"      OT_RESOURCE STRUCTURE  ZSRM_RESOURCE
    *"----------------------------------------------------------------------
    *&Flag  0-手动; 1-自动
      DATA:L_TABIX TYPE SY-TABIX.
      DATA:LV_FLAG TYPE C.
      DATA:LV_CON  TYPE STRING.
      DATA: ERROR TYPE REF TO CX_AI_SYSTEM_FAULT.
      DATA: PRXY  TYPE REF TO ZCO_REQUEST_IMATNR_RESOURCE_SE."Proxy Name
      DATA: Z_IN  TYPE ZREQUEST8. "request in
      DATA: Z_OUT TYPE ZRESPONSE8."request out
      DATA: O_CX  TYPE  REF  TO  CX_ROOT.
      DATA: O_ERROR TYPE REF TO CX_ST_ERROR.
      TYPES:BEGIN OF TY_RE,
        BACKUP1 TYPE STRING,"备用字段1
        BACKUP2 TYPE STRING,"备用字段2
        BACKUP3 TYPE STRING,"备用字段3
        BACKUP4 TYPE STRING,"备用字段4
        BACKUP5 TYPE STRING,"备用字段5
        EBELN   TYPE STRING,"采购订单号
        EBELP   TYPE STRING,"采购订单行项目号
        LIFNRAMOUNT TYPE MENGE, "供应商库存数量 "结构-MENGE:物料主记录视图: 可选的物料数量
        MAKTX   TYPE STRING,    "物料描述
        MATNR   TYPE STRING,    "物料代码
        PROAMOUNT TYPE MENGE,   "生产数量
        STOREAMOUNT TYPE MENGE, "线边仓库存数量
        PRODATE TYPE DATUM,     "生产日期
            END OF TY_RE.
      DATA:GT_RE TYPE STANDARD TABLE OF TY_RE,
           WA_RE LIKE LINE OF GT_RE.
    
    
    *&job user
      IF SY-UNAME EQ ''.
        LV_FLAG = '1'.
      ELSE.
        LV_FLAG = '0'.
      ENDIF.
    
      CONCATENATE '<in0>' LV_FLAG '</in0>' '<in1>' I_EBELN '</in1>' '<in2>' I_MATNR '</in2>' INTO LV_CON.
    
    *&s1.call proxy get data via cis
    *  Z_IN-REQUEST_DATA = '<?xml version="1.0" encoding="UTF-8"?><handleIMatnrResourceService><in0>' && LV_FLAG && '</in0></handleIMatnrResourceService>'.
      CONCATENATE '<?xml version="1.0" encoding="UTF-8"?><handleIMatnrResourceService>' LV_CON '</handleIMatnrResourceService>' INTO Z_IN-REQUEST_DATA.
      CLEAR ERROR.
      TRY.
          CREATE OBJECT PRXY
            EXPORTING
              LOGICAL_PORT_NAME = 'ZMLSCP_GET_RESOURCE'.
          CALL METHOD PRXY->REQUEST
            EXPORTING
              INPUT  = Z_IN
            IMPORTING
              OUTPUT = Z_OUT.
        CATCH CX_AI_SYSTEM_FAULT INTO ERROR.
          O_STATU = 'E'.
          O_MSG = ERROR->ERRORTEXT.
          RETURN.
      ENDTRY.
    
    *&1.1 is it ok?
      IF Z_OUT-RETURN_CODE = 'E'.
        O_STATU = 'E'.
        O_MSG = Z_OUT-RETURN_DESC.
        RETURN.
      ENDIF.
    
      BREAK-POINT.
    *&s2.transfer XML
      IF Z_OUT-RETURN_DATA IS NOT INITIAL."业务系统返回报文不为空
        TRY .
            CLEAR:GT_RE,WA_RE.
            CALL TRANSFORMATION  ZML_XML_TRANS02"ZML_XML_RESOURCE
            SOURCE XML Z_OUT-RETURN_DATA
            RESULT MLMATNRRESOURCE =  GT_RE.
    *
            IF  SY-SUBRC NE 0.
              O_STATU = 'E'.
              O_MSG = 'XML解析失败!'.
              RETURN.
            ENDIF.
      BREAK-POINT.
          CATCH CX_ST_ERROR INTO O_ERROR .
            O_STATU = 'E'.
            O_MSG = O_ERROR->GET_TEXT( ) .
        ENDTRY.
      ELSE.
        O_STATU = 'E'.
        O_MSG = '返回结果为空!'.
      ENDIF.
    
    
    *&s3.data save to ZSRM_RESOURCE
      IF GT_RE[] IS NOT INITIAL.
        LOOP AT GT_RE INTO WA_RE.
          MOVE-CORRESPONDING WA_RE TO OT_RESOURCE.
          OT_RESOURCE-ZDATUM = SY-DATUM.
          OT_RESOURCE-ZCPUTM = SY-UZEIT.
          OT_RESOURCE-USNAM  = SY-UNAME.
          OT_RESOURCE-ZFLAG  = LV_FLAG.
          APPEND OT_RESOURCE.
    * MODIFY GT_RE FROM WA_RE.
    * CLEAR WA_RE.
        ENDLOOP.
    * TRY
        MODIFY ZSRM_RESOURCE FROM TABLE OT_RESOURCE.
        IF SY-SUBRC EQ 0.
          COMMIT WORK AND WAIT .
          DESCRIBE TABLE OT_RESOURCE LINES L_TABIX.
          O_STATU = 'S'.
          O_MSG   = '成功存入ZSRM_RESOURCE' && L_TABIX && '条记录!'.
        ELSE.
          ROLLBACK WORK.
          O_STATU = 'E'.
          O_MSG   = '数据存入 ZSRM_RESOURCE表失败!'.
        ENDIF.
    
      ENDIF.
    
    
    
    ENDFUNCTION.
  • 相关阅读:
    Return Largest Numbers in Arrays-freecodecamp算法题目
    Title Case a Sentence-freecodecamp算法题目
    Find the Longest Word in a String-freecodecamp算法题目
    Check for Palindromes-freecodecamp算法题目
    Factorialize a Number-freecodecamp算法题目
    Reverse a String-freecodecamp算法题目
    js拖动div
    Jquery $.ajax()方法详解
    jQuery中$.each()方法的使用
    echarts的pie图中,各区块颜色的调整
  • 原文地址:https://www.cnblogs.com/rainysblog/p/6654649.html
Copyright © 2020-2023  润新知