方法一: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文件的更多相关文章

  1. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  2. Java生成XML文件

    我们在数据库中的数据可以将其提取出来生成XML文件,方便传输.例如数据库中有Admin这张表: 我们写一个java类表示admin数据: package xmlDom.vo; import java. ...

  3. Android 使用xml序列化器生成xml文件

    在<Android 生成xml文件>一文中使用流的形式写入xml格式文件,但是存在一定的问题,那就是在短信内容中不能出现<>之类的括号,本文使用xml序列化器来解决 xml序列 ...

  4. C# 生成xml文件

    本篇文章旨在.net环境下生成xml文件,以控制台应用程序为例进行说明. 1.在vs中新建控制台应用程序CreateXml 2.CreateXmlFile:主要生成xml的函数 public void ...

  5. 视频播放实时记录日志并生成XML文件

    需求描述: 在JWPlayer视频播放过程中,要求实时记录视频观看者播放.暂停的时间,并记录从暂停到下一次播放时所经过的时间.将所有记录保存为XML文件,以方便数据库的后续使用. 实现过程: 尝试1: ...

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

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  7. LINQ to XML 从逗号分隔值 (CSV) 文件生成 XML 文件

    参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 本示例演示如何使用 语言集成查询 (LINQ) 和 LINQ to XML 从逗号分隔 ...

  8. 生成XML文件,通过实体生成XML文件

    实体 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xm ...

  9. PHP中的生成XML文件的4种方法(转)

    <?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...

随机推荐

  1. LeetCode OJ--Subsets II

    https://oj.leetcode.com/problems/subsets-ii/ 求一个集合的子集,但集合中有重复元素. 求子集的问题,对应着数的二进制,相当于对二进制的一个遍历. #incl ...

  2. 用jQuery File Upload实现简单的文件上传

    FORM中的代码: {# file_path #} <div class="form-group"> <label class="control-lab ...

  3. LA 2995 Image Is Everything

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  4. C# 根据生日获取年龄

    C# 根据生日获取年龄 根据生日计算出准确的年龄,不等于0时,返回的是岁,等于0时,返回的是天(以‘-’来区分) public static string GetAgeByBirth(string B ...

  5. for 、foreach 、iterator 三种遍历方式的比较

    习惯用法 for.foreach循环.iterator迭代器都是我们常用的一种遍历方式,你可以用它来遍历任何东西:包括数组.集合等 for 惯用法: List<String> list = ...

  6. mybatis-plus generator template 中的全部属性

    { "date": "2018-10-30", "superServiceImplClassPackage": "com.baom ...

  7. BZOJ1010玩具裝箱Toy

    @[斜率優化] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中. P ...

  8. es6系列-变量声明

    es6系列所有文章都是阅读阮一峰老师的<ES6标准入门>(第2版)所做的读书笔记.方便日后查阅相关基础知识. git地址: https://github.com/rainnaZR/es6- ...

  9. Geoserver跨域请求设置

    使用OpenLayers请求GeoServer发布的WFS服务时,如果不是相同的域可能会出现如下问题. 已拦截跨源请求:同源策略禁止读取位于 http://localhost:8080/geoserv ...

  10. EventBus3.0使用笔记.md

    事件总线这个其实没什么好说的,除了已经ondestroy的fragment或者activity不能接受外,只要定义了的都能接收消息 代码如下,需要注意的一点就是接收的监听事件必须用public修饰并且 ...