[SAP ABAP开发技术总结]ABAP读写、解析XML文件
20.6. XML. 236
20.6.1. 生成... 237
20.6.2. 解析... 240
20.6. XML
if_ixml
if_ixml_document
if_ixml_node
if_ixml_element
if_ixml_istream
if_ixml_ostream
document、element、ATTRIBUTE、COMMENT、TEXT都属于 Node
20.6.1. 生成
<?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>
TYPE-POOLS: ixml,abap.
TYPES: BEGIN OF xml_line,
data(512) 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?]
document = l_document )." l_document为根节点
l_rc = l_renderer->render( )."注:执行此句后, l_xml_table内表里才会有数据
l_xml_size = l_ostream->get_num_written_raw( )."取得XML数据大小
*************************************************************
**--将xml数据导出到本地
* call method cl_gui_frontend_services=>gui_download
* exporting
* bin_filesize = l_xml_size
* filename = 'd:\flights.xml'
* filetype = 'BIN'
* changing
* data_tab = l_xml_table[].
************************************************************
****************************************************
**--将XML数据导入到内表
* DATA xmldata TYPE xstring .
* DATA: result_xml TYPE STANDARD TABLE OF smum_xmltb .
* DATA: return TYPE STANDARD TABLE OF bapiret2 .
* DATA: wa_xml TYPE smum_xmltb.
* "如果需要上载XML可以用一下方法
* CALL FUNCTION 'GUI_UPLOAD'
* EXPORTING
* filename = 'd:\flights.xml'
* filetype = 'BIN'
* IMPORTING
* filelength = l_xml_size
* TABLES
* data_tab = l_xml_table.
* "将二进制内表转换(拼接)成一个二进制串
* CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
* EXPORTING
* input_length = l_xml_size
* IMPORTING
* buffer = xmldata
* TABLES
* binary_tab = l_xml_table.
* CALL FUNCTION 'SMUM_XML_PARSE'"解析
* EXPORTING
* xml_input = xmldata
* TABLES
* xml_table = result_xml
* return = return.
* LOOP AT result_xml INTO wa_xml .
* WRITE: / wa_xml-hier,wa_xml-type,wa_xml-cname,wa_xml-cvalue.
* ENDLOOP.
************************************************
**************************************************
**将XML转换成字符串
* DATA: w_string TYPE xstring.
* DATA ls_xml TYPE string.
* FIELD-SYMBOLS: <fs> TYPE string.
* 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.
*
* DATA: convin TYPE REF TO cl_abap_conv_in_ce.
* "创建解码对象
* convin = cl_abap_conv_in_ce=>create( input = w_string ).
* DATA: str TYPE string.
* CALL METHOD convin->read
* IMPORTING
* data = ls_xml.
* WRITE: / ls_xml.
* 将一个二进制串分割存储到二进制内表中
* call function 'SCMS_XSTRING_TO_BINARY'
* exporting
* BUFFER = W_STRING
* importing
* OUTPUT_LENGTH = L_XML_SIZE
* tables
* BINARY_TAB = L_XML_TABLE.
"将二进制内表转换(拼接)成一个字符串
* CALL FUNCTION 'SCMS_BINARY_TO_STRING'
* EXPORTING
* input_length = l_xml_size
* IMPORTING
* text_buffer = ls_xml
* TABLES
* binary_tab = l_xml_table.
* WRITE: / ls_xml.
****************************************************************
20.6.2. 解析
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.
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.
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 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.
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.
[SAP ABAP开发技术总结]ABAP读写、解析XML文件相关推荐
- [SAP ABAP开发技术总结]ABAP调优——Open SQL优化
11.1. 数据库编程方面优化 1. 不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2. 不要使 ...
- [SAP ABAP开发技术总结]ABAP调优——代码优化
11.2. 程序 1. READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH读取标准内表使用二分查找 2. 在循环(LOOP AT ...WHE ...
- 解析XML文件——SAX解析技术
通常的文件等等都是以xml形式存储的,当我们要查看时就必须将他们解析出来.通常有nSimple API for XML(SAX) :nDocument Object Model(DOM)(不建议使用) ...
- Android实例RSS客户端开发(2)--解析XML文件
一 介绍完RSS之后,下面开始讲解如何解析RSS文件.因为RSS是基于XML的,所以我们就直接介绍如何解析XML文件. 解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模 ...
- python解析xml数据_数据开发_Python解析XML文件
解析XML文件 XML是可扩展标记语言,主要用于传输和存储数据 解析方式 使用lxml解析 主要注意: text tag attrib 使用方式 有 get() 以及迭代的情况 数据示例 a31 代码 ...
- 一、dom4j技术--使用dom4j解析xml文件
dom4j解析xml文件 一.导包,编写bean类和测试类 二.编码测试,通过dom4j生成bean对象 books.xml <?xml version="1.0" enco ...
- Java解析xml文件dom4j篇(基于xml配置文件完成Excel数据的导入、导出功能完整实现)
DOM4J解析XML文件 dom4j是一个Java的XML API,是jdom的升级产品,用来读写XML文件.另外对比其他API读写XML文件,dom4j是一个十分优秀的JavaXML API,具有性 ...
- java stax xml_Java小知识:使用Stax解析xml文件
问题: 通过使用Stax解析xml文件时,出现以下错误消息: 线程"主"中的异常javax.xml.stream.XMLStreamException:[row,col]:[86, ...
- c语言 自己编程解析 xml,C语言解析.XML文件
最近手头上有个活在忙,中间很重要的一部分就是用C语言将.XML文件中想要的key和value读出来,与之前已有的值进行比较. 核心的.XML文件的格式如下: zzz xxx yyy 而我的思路是这样的 ...
最新文章
- 使用文本用户界面(NMTUI)进行网络配置
- git 拉取远程分支及修改远程仓库地址
- 秒杀多线程第十一篇 读者写者问题
- 如何在 SAP CRM WebClient UI 里在 Context node 上下文里访问其他 Context Node 的数据
- ctrl c 失效了_[安卓+PC双端]超C女仆无馬中字
- mounted钩子函数_怎样实现Vue中mounted钩子函数获取节点高度
- 为什么要序列化Serialization
- Spark数据倾斜是如何造成的
- KindEditor富文本编辑从数据库取出来内容回显在页面上会自动增加行间距以及回车换行会自动间距变大的问题...
- 串口屏与6050_MPU6050 STM32控制 六轴传感器,可通过串口屏显示,还可连接匿名上位机 欧拉角 SCM 单片 发 267万源代码下载- www.pudn.com...
- 常用EXE文件反编译工具
- 高一计算机基础知识课程ppt课件,高一计算机基础课件.ppt
- 【职场日语】日文简历模板
- hbase时间同步造成region severs的问题
- Latex中插入多张图片,实现并排排列或者多行多列排列
- 高级程序员到底长什么样子?
- 医院借力泛微:落地高效、合规的数字化内控管理系统
- 【AI教程】AI基础学习笔记(第3天)
- 基于单片机的智能电子秤系统设计(#0507)
- 【Appium踩坑】Encountered internal error running command: Error executing adbExec.