zoukankan      html  css  js  c++  java
  • ABAP-内表转换XML

    REPORT  Y_XB_TEST10.
    
    *&---------------------------------------------------------------------*
    *&声明及定义部分
    *&---------------------------------------------------------------------*
    
    TYPE-POOLS: IXML.
    
    ****声明存放XML文件的结构
    TYPES:BEGIN OF XML_LINE,
            DATA(256) TYPE X,
          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.
    
    ****声明XML元素
    DATA:L_ELEMENT_INPOT    TYPE REF TO IF_IXML_ELEMENT,
         L_ELEMENT_CARRID   TYPE REF TO IF_IXML_ELEMENT,
         L_ELEMENT_CONNID   TYPE REF TO IF_IXML_ELEMENT,
         L_ELEMENT_CITYFROM TYPE REF TO IF_IXML_ELEMENT,
         L_ELEMENT_AIRPFROM TYPE REF TO IF_IXML_ELEMENT,
         L_ELEMENT_CITYTO   TYPE REF TO IF_IXML_ELEMENT,
         L_ELEMENT_AIRPTO   TYPE REF TO IF_IXML_ELEMENT,
         L_VALUE            TYPE STRING.
    
    ****声明存放XML文件的内表以及字节数
    DATA: L_XML_TABLE TYPE TABLE OF XML_LINE,
          L_XML_SIZE  TYPE I,
          L_RC        TYPE I,
          FLAG        TYPE STRING.
    
    ****声明数据内表
    DATA:BEGIN OF I_DATA OCCURS 0,
           CARRID   TYPE SPFLI-CARRID,    "航线代码
           CONNID   TYPE SPFLI-CONNID,    "航班连接编号
           CITYFROM TYPE SPFLI-CITYFROM,  "起飞城市
           AIRPFROM TYPE SPFLI-AIRPFROM,  "始发机场
           CITYTO   TYPE SPFLI-CITYTO,    "到达城市
           AIRPTO   TYPE SPFLI-AIRPTO,    "目标机场
         END OF I_DATA.
    
    *&---------------------------------------------------------------------*
    *& 主逻辑部分
    *&---------------------------------------------------------------------*
    
    START-OF-SELECTION.
      PERFORM ZFORM_GET_DATA.
      PERFORM ZFORM_SAVE_XML.
    
    
    *&---------------------------------------------------------------------*
    *& FORM定义部分
    *&---------------------------------------------------------------------*
    *&---------------------------------------------------------------------*
    *&      Form  zform_get_data
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM ZFORM_GET_DATA.
      SELECT CARRID
             CONNID
             CITYFROM
             AIRPFROM
             CITYTO
             AIRPTO
        INTO TABLE I_DATA
             FROM SPFLI
        UP TO 10 ROWS.
    ENDFORM.                    "zform_get_data
    
    *&---------------------------------------------------------------------*
    *&      Form  save_xml
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM ZFORM_SAVE_XML.
      LOOP AT I_DATA.
    ****创建一个XML容器
        AT FIRST.
          L_IXML = CL_IXML=>CREATE( ).
    ****创建一个文档对象模型
          L_DOCUMENT = L_IXML->CREATE_DOCUMENT( ).
    ****填充根节点
          L_ELEMENT_INPOT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                            NAME = 'INPOT'
                            PARENT = L_DOCUMENT ).
        ENDAT.
        AT NEW CARRID.
    ****填充子节点(航线代码)
          L_VALUE = I_DATA-CARRID.
          L_ELEMENT_CARRID = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                            NAME = 'CARRID'
                            VALUE = L_VALUE
                            PARENT = L_ELEMENT_INPOT ).
          FLAG = FLAG + 1.
          L_RC = L_ELEMENT_CARRID->SET_ATTRIBUTE( NAME = 'ID' VALUE =
                 FLAG ).
        ENDAT.
    *****填充子节点(航班连接编号)
        AT NEW CONNID.
          L_VALUE = I_DATA-CONNID.
          L_ELEMENT_CONNID = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                               NAME = 'PRUEFLOS'
                               VALUE = L_VALUE
                               PARENT = L_ELEMENT_CARRID ).
        ENDAT.
    *****填充子节点(细节)
        L_VALUE = I_DATA-CITYFROM. "起飞城市
        L_ELEMENT_CITYFROM = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                              NAME = 'CITYFROM'
                              VALUE = L_VALUE
                              PARENT = L_ELEMENT_CONNID ).
        L_VALUE = I_DATA-AIRPFROM.  "始发机场
        L_ELEMENT_AIRPFROM = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                              NAME = 'AIRPFROM'
                              VALUE = L_VALUE
                              PARENT = L_ELEMENT_CONNID ).
        L_VALUE = I_DATA-CITYTO.    "到达城市
        L_ELEMENT_CITYTO = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                              NAME = 'CITYTO'
                              VALUE = L_VALUE
                              PARENT = L_ELEMENT_CONNID ).
        L_VALUE = I_DATA-AIRPTO.    "始发机场
        L_ELEMENT_AIRPTO = L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                              NAME = '目标机场'
                              VALUE = L_VALUE
                              PARENT = L_ELEMENT_CONNID ).
      ENDLOOP.
    ****创建一个流容器
      L_STREAMFACTORY = L_IXML->CREATE_STREAM_FACTORY( ).
    ****连接内部XML表到流容器
      L_OSTREAM = L_STREAMFACTORY->CREATE_OSTREAM_ITABLE(
                  TABLE = L_XML_TABLE ).
    ****递交XML文档
      L_RENDERER = L_IXML->CREATE_RENDERER( OSTREAM  = L_OSTREAM
                                            DOCUMENT = L_DOCUMENT ).
      L_RC = L_RENDERER->RENDER( ).
    ****保存XML文档
      L_XML_SIZE = L_OSTREAM->GET_NUM_WRITTEN_RAW( ).
    *  CALL METHOD cl_gui_frontend_services=>gui_download
    *    EXPORTING
    *      bin_filesize = l_xml_size
    *      filename     = 'c:	empINPOT.xml'
    *      filetype     = 'BIN'
    *    CHANGING
    *      data_tab     = l_xml_table
    *    EXCEPTIONS
    *      OTHERS       = 24.
    *  IF sy-subrc = 0.
    *    MESSAGE 'XML文件保存成功!!!!' TYPE 'I'.
    *    STOP.
    *  ENDIF.
    
    *将XML转换成字符串
      DATA: W_STRING TYPE XSTRING.
      DATA LS_XML TYPE STRING.
    
    **将XML转换成字符串
    *  call function 'SDIXML_DOM_TO_XML'
    *    exporting
    *      DOCUMENT      = L_DOCUMENT
    *    importing
    *      XML_AS_STRING = W_STRING
    *      SIZE          = L_XML_SIZE
    *    tables
    *      XML_AS_TABLE  = L_XML_TABLE
    *    exceptions
    *      NO_DOCUMENT   = 1
    *      others        = 2.
    *  if SY-SUBRC <> 0.
    ** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    **         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    *  endif.
    
    * LS_XML为转换出来的XML
      CALL FUNCTION 'SCMS_BINARY_TO_STRING'
        EXPORTING
          INPUT_LENGTH = L_XML_SIZE
        IMPORTING
          TEXT_BUFFER  = LS_XML
        TABLES
          BINARY_TAB   = L_XML_TABLE
        EXCEPTIONS
          FAILED       = 1
          OTHERS       = 2.
    
      IF SY-SUBRC <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
    
    ENDFORM.                    "save_xml
  • 相关阅读:
    对虚机设备Bridge ,Vlan, VETH, TAP详细介绍
    DevStack部署Openstack环境
    Ubuntu配置 PPTP 服务器端
    Ubuntu 配置PPTP客户端
    Git学习笔记
    Mysql安装随记,整理内容来源网络
    GitHub访问慢的优化处理
    NetCore部署到Linux服务器+Supervisor的步骤及过程中踩过的坑
    JavaScript的定时器如何先触发一次再延时
    在实现文本框只能输入数字和小数点的基础上实现了价格样式(保留两位小数)
  • 原文地址:https://www.cnblogs.com/liangliang245916893/p/14267022.html
Copyright © 2011-2022 走看看