20170319 ABAP 生成XML文件

Posted Rainystuday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

以上是关于20170319 ABAP 生成XML文件的主要内容,如果未能解决你的问题,请参考以下文章

XML文件和ABAP内表数据的相互转换(基础篇)

如何通过abap中的XSLT程序读取XML文件的属性

事务代码STRANS的使用(XML与ABAP内表相互转换)

XML文件与ABAP结构/内表的转换

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

ABAP表生成Java实体Bean