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

时间: 2024-10-15 06:15:38

20170319 ABAP 生成XML文件的相关文章

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

利用oxygen编辑并生成xml文件,并使用JAVA的JAXB技术完成xml的解析

首先下载oxygen软件(Oxygen XML Editor),目前使用的是试用版(可以安装好软件以后get trial licence,获得免费使用30天的权限,当然这里鼓励大家用正版软件!!!) 1 首先建立一个空白XML文件,直接点击下图所示即可: 2 可以使用xml文本编辑界面,或者使用xml树状图编辑界面 切换到xml树状图编辑界面的方法为: 即可调出当前xml文件所对应的xml树状图编辑界面 3 设计并编辑xml文件 根据自己的需要可以利用xml树状图操作界面来方便的设计自己的xml

使用Pull解析器生成XML文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器. 1.使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在下方 public static String writeXML(List<Person> persons, Writer wri

5.29日 自己程序的编写,目的:生成xml文件

1.创建了XMLModel这个类:本来还有个rebuildformXML的方法,但是现在用不到,以后再说. public interface XmlModel { public void initModel(); public void doSaveXML(); } 2.对AbstractModel这个类进行了修改,最终变为: package hellogef.model; import java.beans.PropertyChangeListener; import java.beans.P

获取mysql内容,生成xml文件,并且以webservice形式发送

<xyt> <news id> <url></url> <title></title> </news> </xyt> 其实是三个知识点综合到一起的,包括如何访问mysql,如何生成xml文件,如何使用进行webservice开发 好了,话不多说,直接粘代码 package com.service; import java.io.FileOutputStream; import java.io.IOExcepti

PHP读取及生成xml文件实测

PHP生成xml文件方法的四个方法,博主google了下http://www.phppan.com/2009/10/use-php-create-xml-file/这篇写的还不错,实测用了php现成支持的DomDocument方式生成xml文件,是可以用的. 注意XMLWriter的方式生成需要PHP开启扩展php-xml支持. 以下是博主亲测可用的demo: $xml = new DOMDocument('1.0', 'utf-8'); $xml_MeetingAttendee = $xml-

获得mysql内容,生成xml文件,另外,为了webservice发送

<xyt> <news id> <url></url> <title></title> </news> </xyt> 事实上是三个知识点综合到一起的.包含怎样訪问mysql.怎样生成xml文件,怎样使用进行webservice开发 好了.话不多说.直接粘代码 package com.service; import java.io.FileOutputStream; import java.io.IOExcept

Android下使用pull解析器生成XML文件、读取XML文件

Android下使用Pull解析器 1,Pull解析器的运行方式与SAX解析器相似.它提供了类似的事件,如:开始元素和结束元素事件. 2,使用parser.next()可以进入下一个元素并触发相应事件. 3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理. 4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值. 5,相关API: 获得当前节点事件类型:parser.getEventType(); 获得下一节点事件类型

CALL TRANSFORMATION 的方法生成XML文件

*&---------------------------------------------------------------------**& Report  Z_BARRY_XML_CALL*&*&---------------------------------------------------------------------**& CALL TRANSFORMATION的方法生成XML例程*& 适用ECC5以上系统*& 普通方法生成