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() 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 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文件的更多相关文章
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- Java生成XML文件
我们在数据库中的数据可以将其提取出来生成XML文件,方便传输.例如数据库中有Admin这张表: 我们写一个java类表示admin数据: package xmlDom.vo; import java. ...
- Android 使用xml序列化器生成xml文件
在<Android 生成xml文件>一文中使用流的形式写入xml格式文件,但是存在一定的问题,那就是在短信内容中不能出现<>之类的括号,本文使用xml序列化器来解决 xml序列 ...
- C# 生成xml文件
本篇文章旨在.net环境下生成xml文件,以控制台应用程序为例进行说明. 1.在vs中新建控制台应用程序CreateXml 2.CreateXmlFile:主要生成xml的函数 public void ...
- 视频播放实时记录日志并生成XML文件
需求描述: 在JWPlayer视频播放过程中,要求实时记录视频观看者播放.暂停的时间,并记录从暂停到下一次播放时所经过的时间.将所有记录保存为XML文件,以方便数据库的后续使用. 实现过程: 尝试1: ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- LINQ to XML 从逗号分隔值 (CSV) 文件生成 XML 文件
参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 本示例演示如何使用 语言集成查询 (LINQ) 和 LINQ to XML 从逗号分隔 ...
- 生成XML文件,通过实体生成XML文件
实体 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xm ...
- PHP中的生成XML文件的4种方法(转)
<?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...
随机推荐
- hdu 1796(容斥原理+状态压缩)
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- http错误种类及原因
http://blog.csdn.net/dxykevin/article/details/50950878 [摘要]HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应 ...
- Codeforces 246E Blood Cousins Return(树上启发式合并)
题目链接 Blood Cousins Return #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) f ...
- ES6 的Object.assign(target, source_1, ···)方法与对象的扩展运算符
一.基本概念 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象. Ob ...
- [ZJOI 2016] 小星星
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 653 Solved: 400[Submit][Status] ...
- 动态加载/删除css文件以及图片预加载
动态加载/删除css文件以及图片预加载 功能模块页面 最近,工作中遇到了一个比较奇葩的需求:要在一个页面(PC端)增加一个功能模块,但是这个页面在不久之后要重构,为了新增加的模块可以继续复用, ...
- -webkit-transform:translate3d(0,0,0)触发GPU加速,让网页动画更流畅
前段时间,依照美拍的视频效果写了一个效果类似的网页版的动画. 电脑上安装了三种浏览器:IE.Chrome.Firefox.分别作了測试,结果显示Chrome在这方面的渲染效果最差.常常出现卡顿现象.f ...
- Unix系统介绍
一.基础知识 操作系统 用户与计算机硬件之间的界面,是控制.管理计算机内各种硬件与软件资源.它是一个多用户.多任务.分时的操作系统. 对于分时系统:假如a进程需要16个时间片,现在根据优先级只分配了1 ...
- iOS 插件制作
概述 我们平时也使用了非常多的xcode插件,尽管官方对于插件制作没有提供不论什么支持,可是载入三方的插件,默认还是被同意的.第三方的插件,须要存放在 ~/Library/Application Su ...
- 笔记12 export to excel (NPOI)
1:filestream 熟悉关于文件操作 ==>fs.Seek(0, SeekOrigin.Begin);//每次打开文件, ==>若果重写覆盖的话,必须先清空 fs.SetLength ...