日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[SAP ABAP开发技术总结]ABAP读写、解析XML文件

發布時間:2025/3/19 asp.net 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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

documentelementATTRIBUTECOMMENTTEXT都屬于 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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。