上次说到在UI里面解析CSV格式的EXCEL例子,这次说说解析XML格式的。
这次用到ABAP里面的正则表达式,具体的用法可以看我上一篇的转帖。
我们还有一个标准程序【DEMO_REGEX_TOY】可以用来试验自己写的正则表达式对不对。
页面上需要一个上传控件。
<%@page language="abap" %>
<%@extension name="thtmlb" prefix="thtmlb" %>
<%@extension name="chtmlb" prefix="chtmlb" %>
<%@extension name="bsp" prefix="bsp" %>
<thtmlb:fileUpload id = "fileUpload1"
onUpload = "UPLOADFILE"
uploadText = "上传"
tooltip = "上传数据" />
METHOD eh_onuploadfile.
***实例化上传数据控件并使用
* -------------------------------------------------------------------
* get the file attributes and content
DATA lr_file TYPE REF TO cl_thtmlb_fileupload.
DATA lv_file_name LIKE lr_file->file_name.
DATA lv_file_content LIKE lr_file->file_content.
DATA lv_file_length LIKE lr_file->file_length.
DATA lv_file_type LIKE lr_file->file_content_type.
DATA lv_length TYPE i.
lr_file ?= htmlb_event_ex.
lv_file_name = lr_file->file_name.
lv_file_content = lr_file->file_content.
lv_file_length = lr_file->file_length.
*lv_file_type = lr_file->file_content_type.
*CHECK lv_file_type = 'application/vnd.ms-excel'.
* get the last 4 bites of the file name
lv_length = strlen( lv_file_name ).
CHECK lv_length > 4.
lv_length = lv_length - 4.
* check the file type
* IF lv_file_name+lv_length(4) <> '.xml'.
* CALL METHOD lr_message_container->add_message "判断格式是不是xml
* EXPORTING
* iv_msg_type = 'E'
* iv_msg_id = 'ZXXXX'
* iv_msg_number = '001'
* iv_show_only_once = 'X'.
*
* lv_exit = 1.
* EXIT.
* ENDIF.
***将二进制流转换为string
DATA lr_converter TYPE REF TO cl_abap_conv_in_ce.
DATA lv_filestring TYPE string .
CALL METHOD cl_abap_conv_in_ce=>create
EXPORTING
encoding = 'UTF-8'
endian = 'L'
replacement = '#'
ignore_cerr = abap_true
input = lv_file_content
RECEIVING
conv = lr_converter.
lr_converter->read( IMPORTING data = lv_filestring ).
DATA lt_str TYPE TABLE OF string.
DATA lt_str2 TYPE TABLE OF string.
DATA lv_str TYPE string.
DATA moff TYPE i.
DATA mlen TYPE i.
SPLIT lv_filestring AT cl_abap_char_utilities=>cr_lf INTO TABLE lt_str.
LOOP AT lt_str INTO lv_str.
IF lv_str CP '*<Data*/Data>*'.
FIND REGEX '<Data.*\/Data>' IN lv_str
IGNORING CASE
MATCH OFFSET moff
MATCH LENGTH mlen.
lv_str = lv_str+moff(mlen).
FIND REGEX '>.*<' IN lv_str
IGNORING CASE
MATCH OFFSET moff
MATCH LENGTH mlen.
lv_str = lv_str+moff(mlen).
REPLACE '<' IN lv_str WITH ''.
REPLACE '>' IN lv_str WITH ''.
APPEND lv_str TO lt_str2.
ENDIF.
ENDLOOP.
BREAK-POINT.
ENDMETHOD.