zoukankan      html  css  js  c++  java
  • 20170319 ABAP 生成XML文件

    方法一:ABAP 使用method方式操作XML

    转自:http://www.cnblogs.com/jiangzhengjun/p/4265595.html

    方法二:STRANS 转换工具;使用strans 开发将内表转换xml文件,并可以将xml文件解析回到内表;

    参考:http://www.cnblogs.com/wuqingbo/p/6229289.html

    ->一、XML定义?

    if_ixml
    if_ixml_document
    if_ixml_node
    if_ixml_element
    if_ixml_istream
    if_ixml_ostream

    document、element、ATTRIBUTE、COMMENT、TEXT 都属于Node

    生成:
    <?xml version="1.0"?>
    -<flow BAPI="ZBAPI_MM_RK_AFTER_APP"Des="广深公司-采购订单"KEY="gsgs-cgdd">
     -<customform>
      -<fd n="flight">
       <V>110000</V>
      -</fd>
    
      -<fd n="flight">
       <V>090000</V>
      -</fd>
     </customform>
    -</flow>
    *&---------------------------------------------------------------------*
    *& Report  YTST_201703_XML001
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    
    REPORT  YTST_201703_XML001.
    
    TYPE-POOLS: IXML,ABAP.
    TYPES: BEGIN OF XML_LINE,
    *        DATA(512) TYPE X,"这里的长度设置不会影响输出结果,设置成1都可以
            DATA TYPE X,"这里的长度设置不会影响输出结果,设置成1都可以
           END OF XML_LINE.
    DATA: L_IXML            TYPE REF TO IF_IXML,
          L_STREAMFACTORY   TYPE REF TO IF_IXML_STREAM_FACTORY,
          L_OSTREAM         TYPE REF TO IF_IXML_OSTREAM,
          L_RENDERER        TYPE REF TO IF_IXML_RENDERER,
          L_DOCUMENT        TYPE REF TO IF_IXML_DOCUMENT.
    DATA: L_ELEMENT_FLIGHTS TYPE REF TO IF_IXML_ELEMENT,
          L_ELEMENT_AIRLINE TYPE REF TO IF_IXML_ELEMENT,
          L_ELEMENT_FLIGHT  TYPE REF TO IF_IXML_ELEMENT,
          L_ELEMENT_DUMMY   TYPE REF TO IF_IXML_ELEMENT,
          L_VALUE           TYPE STRING.
    DATA: L_XML_TABLE       TYPE TABLE OF XML_LINE WITH HEADER LINE,
          L_XML_SIZE        TYPE I,
          L_RC              TYPE I.
    DATA: LT_SPFLI          TYPE TABLE OF SPFLI.
    DATA: L_SPFLI           TYPE SPFLI.
    
    START-OF-SELECTION.
      SELECT * FROM SPFLI INTO TABLE LT_SPFLI UP TO 2 ROWS.
      SORT LT_SPFLI BY CARRID.
    
    * 生成XML数据
      LOOP AT LT_SPFLI INTO L_SPFLI.
        AT FIRST.
    *       Creating a ixml factory
          L_IXML = CL_IXML=>CREATE( ).
    *       Creating the dom object model
          L_DOCUMENT = L_IXML->CREATE_DOCUMENT( ).
    *       Fill root node with value flow
          L_ELEMENT_FLIGHTS  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                      NAME = 'flow'
                      PARENT = L_DOCUMENT ).
          L_RC = L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME = 'KEY' VALUE = 'gsgs-cgdd' ).
          L_RC = L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME = 'DES' VALUE = '广深公司-采购订单').
          L_RC = L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME = 'BAPI' VALUE ='ZBAPI_MM_RK_AFTER_APP' ).
          L_ELEMENT_AIRLINE  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                      NAME = 'customform'
                      PARENT = L_ELEMENT_FLIGHTS  ). "parent为父节点
        ENDAT.
        AT NEW CONNID.
          L_ELEMENT_FLIGHT  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                      NAME = 'fd'
                      PARENT = L_ELEMENT_AIRLINE  ).
          "l_value = l_spfli-connid.
          L_RC = L_ELEMENT_FLIGHT->SET_ATTRIBUTE( NAME = 'n' VALUE = 'flight' ).
        ENDAT.
        L_VALUE = L_SPFLI-DEPTIME.
        L_ELEMENT_DUMMY  = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                    NAME = 'V'
                    VALUE = L_VALUE
                    PARENT = L_ELEMENT_FLIGHT ).
      ENDLOOP.
    
    *   Creating a stream factory
      L_STREAMFACTORY = L_IXML->CREATE_STREAM_FACTORY( )."[STRI:M] 流
    *   Connect internal XML table to stream factory
      L_OSTREAM = L_STREAMFACTORY->CREATE_OSTREAM_ITABLE( TABLE = L_XML_TABLE[] ).
    *   Rendering the document
      L_RENDERER = L_IXML->CREATE_RENDERER( OSTREAM  = L_OSTREAM    "[?REND?] IMAGE396
                                            DOCUMENT = L_DOCUMENT )."l_document为根节点
      L_RC = L_RENDERER->RENDER( ).                                 "注:执行此句后, l_xml_table内表里才会有数据
      L_XML_SIZE = L_OSTREAM->GET_NUM_WRITTEN_RAW( )."取得XML数据大小

    2.解析

    ABAP程序解析XML
    *&s1.读取xml文件,

    *&s2.
    (1)create
    (2)create document
    (3)create STREAM FACTORY
    (4)create ISTREAM ITABLE

    IXML = CL_IXML=>CREATE( ).
    DOCUMENT = IXML->CREATE_DOCUMENT( ).
    STREAMFACTORY = IXML->CREATE_STREAM_FACTORY( ).
    ISTREAM = STREAMFACTORY->CREATE_ISTREAM_ITABLE( TABLE = XML_TABLE
    SIZE = TOTALSIZE ).
    *a program for parsing.
    *A computer equipped with an XML parser can make decisions about this
    *information.
    PARSER = IXML->CREATE_PARSER( STREAM_FACTORY = STREAMFACTORY
    ISTREAM = ISTREAM
    DOCUMENT = DOCUMENT ).

    *&s3.分节点进行解析:
    CALL METHOD ISTREAM->CLOSE( ).
    CLEAR ISTREAM.
    NODE = DOCUMENT.
    PERFORM PRINT_NODE USING NODE 0.

    *&---------------------------------------------------------------------*
    *& Report  YTST_201703_XML002
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    
    REPORT  YTST_201703_XML002.
    
    TYPE-POOLS: IXML.
    DATA: IXML          TYPE REF TO IF_IXML,
          DOCUMENT      TYPE REF TO IF_IXML_DOCUMENT,
          STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY,
          ISTREAM       TYPE REF TO IF_IXML_ISTREAM,
          PARSER        TYPE REF TO IF_IXML_PARSER,
          NODE          TYPE REF TO IF_IXML_NODE,
          STRING         TYPE STRING,
          COUNT          TYPE I,
          INDEX          TYPE I,
          TOTALSIZE      TYPE I .
    TYPES: BEGIN OF XML_LINE,
            DATA(256) TYPE X,
          END OF XML_LINE.
    DATA: XML_TABLE TYPE TABLE OF XML_LINE.
    
    START-OF-SELECTION.
    *&s1.上传文件
      CALL FUNCTION 'GUI_UPLOAD'
        EXPORTING
          FILENAME   = 'd:flights.xml'
          FILETYPE   = 'BIN'
        IMPORTING
          FILELENGTH = TOTALSIZE
        TABLES
          DATA_TAB   = XML_TABLE
        EXCEPTIONS
          OTHERS     = 11.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    
    *&s2.
    *(1)create
    *(2)create document
    *(3)create STREAM FACTORY
    *(4)create ISTREAM ITABLE
    *(5)create PARSER
      IXML = CL_IXML=>CREATE( ).
      DOCUMENT = IXML->CREATE_DOCUMENT( ).
      STREAMFACTORY = IXML->CREATE_STREAM_FACTORY( ).
      ISTREAM = STREAMFACTORY->CREATE_ISTREAM_ITABLE( TABLE = XML_TABLE
                                                       SIZE = TOTALSIZE ).
      PARSER = IXML->CREATE_PARSER( STREAM_FACTORY = STREAMFACTORY
                                      ISTREAM      = ISTREAM
                                      DOCUMENT     = DOCUMENT ).
      IF PARSER->PARSE( ) NE 0.
        IF PARSER->NUM_ERRORS( ) NE 0.
          COUNT = PARSER->NUM_ERRORS( ).
          WRITE: COUNT, ' parse errors have occured:'.
          DATA: PPARSEERROR TYPE REF TO IF_IXML_PARSE_ERROR,
                I TYPE I.
          INDEX = 0.
          WHILE INDEX < COUNT.
            PPARSEERROR = PARSER->GET_ERROR( INDEX = INDEX ).
            I = PPARSEERROR->GET_LINE( ).
            WRITE: 'line: ', I.
            I = PPARSEERROR->GET_COLUMN( ).
            WRITE: 'column: ', I.
            STRING = PPARSEERROR->GET_REASON( ).
            WRITE: STRING.
            INDEX = INDEX + 1.
          ENDWHILE.
        ENDIF.
      ENDIF.
    
      CALL METHOD ISTREAM->CLOSE( ).
      CLEAR ISTREAM.
      NODE = DOCUMENT.
      PERFORM PRINT_NODE USING NODE 0.
    
    *&---------------------------------------------------------------------*
    *&      Form  print_node
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_NODE     text
    *      -->DEEP       text
    *----------------------------------------------------------------------*
    FORM PRINT_NODE  USING P_NODE TYPE REF TO IF_IXML_NODE DEEP TYPE I.
      DATA: NODETYPE TYPE I,
            ATTRSLEN TYPE I,
            ATTRS TYPE REF TO IF_IXML_NAMED_NODE_MAP,
            ATTR TYPE REF TO IF_IXML_NODE.
      NODETYPE = P_NODE->GET_TYPE( ).
      CASE P_NODE->GET_TYPE( ).
        WHEN IF_IXML_NODE=>CO_NODE_ELEMENT."这里只处理元素节点
          WRITE: /.
          PERFORM PRINTNODEINFO USING '元素' DEEP P_NODE.
          ATTRS = P_NODE->GET_ATTRIBUTES( ).
          ATTRSLEN = ATTRS->GET_LENGTH( ).
          DO ATTRSLEN TIMES.
            ATTR = ATTRS->GET_ITEM( SY-INDEX - 1 ).
            PERFORM PRINTNODEINFO USING '属性' DEEP ATTR.
          ENDDO.
          "WHEN if_ixml_node=>co_node_text.
          "PERFORM printnodeinfo USING '文本' deep p_node.
      ENDCASE.
      DATA: CHILDS TYPE REF TO IF_IXML_NODE_LIST,
            CHILD TYPE REF TO IF_IXML_NODE,
            CHILDSLEN TYPE I.
      CHILDS = P_NODE->GET_CHILDREN( ).
      CHILDSLEN =  CHILDS->GET_LENGTH( ).
      DATA: DEEP2 TYPE I.
      DEEP2 =  DEEP + 1.
      DO CHILDSLEN  TIMES.
        CHILD =  CHILDS->GET_ITEM( SY-INDEX - 1 ).
        PERFORM PRINT_NODE USING CHILD DEEP2.
      ENDDO.
    ENDFORM.                    "print_node
    
    *&---------------------------------------------------------------------*
    *&      Form  printnodeinfo
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->NODETYPE   text
    *      -->DEEP       text
    *      -->NODE       text
    *----------------------------------------------------------------------*
    FORM PRINTNODEINFO USING NODETYPE TYPE STRING DEEP TYPE I NODE TYPE REF TO IF_IXML_NODE.
      DATA: NAME TYPE STRING,
            VALUE TYPE STRING,
            SPACES TYPE STRING.
      DO DEEP TIMES.
        SPACES = SPACES && ` `.
      ENDDO.
      NAME = NODE->GET_NAME( ).
      VALUE = NODE->GET_VALUE( ).
      WRITE:  SPACES, NODETYPE ,NAME,VALUE .
    ENDFORM.                    "printnodeinfo

     

  • 相关阅读:
    Tire树的理解和应用
    C语言:socket简单模拟http请求
    C语言:关于socket的基础知识点
    php中的ip2long和long2ip的理解
    理解php中的pack/unpack/ord/chr
    zlog学习笔记(mdc)
    计算机工作的进行
    期末总结
    第十四周学习报告
    第十三周学习报告
  • 原文地址:https://www.cnblogs.com/rainysblog/p/6580346.html
Copyright © 2011-2022 走看看