对于SAP来说将ABAP内表转为Xml之后会带Item标签,在日常项目需求中不是带item的标签的文件的话,可以使用下面的函数方便的去除掉Item标签。
调用函数
DATA:l_str1 TYPE string.
*替换Item标签
CALL FUNCTION 'ZXML_TRANSFER_ITEMTAG2'
EXPORTING
xmlin = l_str1
IMPORTING
xmlstr = l_str1.
替换Item标签
FUNCTION zxml_transfer_itemtag2.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(XMLIN) TYPE STRING
*" EXPORTING
*" REFERENCE(XMLSTR) TYPE STRING
*" TABLES
*" TAGTAB OPTIONAL
*"----------------------------------------------------------------------
DATA: regex(100).
DATA: tagb(100),
tage(100),
tags(100).
DATA: moff TYPE i,
mlen TYPE i.
DATA: maptab1 TYPE TABLE OF zxml_noden_mapping.
DATA:lv_itext TYPE char50.
DATA:lv_otext TYPE char50.
CHECK xmlin IS NOT INITIAL.
FIND FIRST OCCURRENCE OF '<item>' IN xmlin .
IF sy-subrc <> 0.
MESSAGE e000(oo) WITH '原始XML不包含<item>标签,无法转换'.
ENDIF.
xmlstr = xmlin.
CALL FUNCTION 'ZXML_STRING_REBUILD2' "转换
EXPORTING
xmlin = xmlstr
IMPORTING
xmlout = xmlstr
TABLES
maptab1 = maptab1.
REPLACE ALL OCCURRENCES OF REGEX '<\w+item>' IN xmlstr WITH cl_abap_char_utilities=>cr_lf.
REPLACE ALL OCCURRENCES OF REGEX '</\w+item>' IN xmlstr WITH cl_abap_char_utilities=>cr_lf.
ENDFUNCTION.
替换Item标签
FUNCTION zxml_string_rebuild2.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(XMLIN) TYPE STRING
*" REFERENCE(CASE) TYPE C OPTIONAL
*" REFERENCE(PRETTY) TYPE C OPTIONAL
*" REFERENCE(CHARACTER_SET) TYPE STRING DEFAULT 'UTF-8'
*" EXPORTING
*" REFERENCE(XMLOUT) TYPE STRING
*" REFERENCE(XMLOUTX) TYPE XSTRING
*" REFERENCE(CDATA) TYPE RSTT_T_STRINGS
*" TABLES
*" MAPTAB STRUCTURE ZXML_NODEN_MAPPING OPTIONAL
*" MAPTAB1 STRUCTURE ZXML_NODEN_MAPPING OPTIONAL
*" EXCEPTIONS
*" XML_ERROR
*"----------------------------------------------------------------------
DATA ifxml TYPE REF TO if_ixml.
DATA factory TYPE REF TO if_ixml_stream_factory.
DATA document TYPE REF TO if_ixml_document.
DATA iterator TYPE REF TO if_ixml_node_iterator.
DATA node TYPE REF TO if_ixml_node.
DATA parser TYPE REF TO if_ixml_parser.
DATA istream TYPE REF TO if_ixml_istream.
DATA ostream TYPE REF TO if_ixml_ostream.
DATA encoding TYPE REF TO if_ixml_encoding .
DATA:lv_node TYPE REF TO if_ixml_node."父节点
DATA xmlxstr TYPE xstring.
DATA str TYPE string.
DATA wa_cdata TYPE rstt_s_string.
DATA:lv_name TYPE string.
DATA:lv_name1 TYPE string.
DATA:lv_index TYPE i.
ifxml = cl_ixml=>create( ).
document = ifxml->create_document( ).
factory = ifxml->create_stream_factory( ).
xmlxstr = cl_abap_codepage=>convert_to( source = xmlin ).
istream = factory->create_istream_xstring( string = xmlxstr ).
parser = ifxml->create_parser( document = document
stream_factory = factory
istream = istream
).
IF parser->parse( ) <> 0.
RAISE xml_error.
ENDIF.
iterator = document->create_iterator( ).
DO.
node = iterator->get_next( ).
IF node IS INITIAL.
EXIT.
ENDIF.
IF node->get_type( ) = if_ixml_node=>co_node_element.
CLEAR lv_name.
CLEAR lv_name1.
lv_name = node->get_name( ).
IF lv_name = 'item'."节点名称为Item
lv_node = node->get_parent( )."获取父节点
lv_name1 = lv_node->get_name( )."获取父节点名称
lv_index = cl_abap_list_utilities=>dynamic_output_length( lv_name1 ).
IF lv_index > 4.
lv_index = lv_index - 4.
IF lv_name1+lv_index(4) = 'item'."最后四位为item 取前缀
lv_name1 = lv_name1(lv_index).
ELSE.
str = lv_name1 && 'item'."设置父节点名称为名称+item
lv_node->set_name( str ).
ENDIF.
ENDIF.
str = lv_name1.
node->set_name( str )."设置当前节点为父节点名称
ENDIF.
ELSEIF node->get_type( ) = if_ixml_node=>co_node_cdata_section.
wa_cdata-string = node->get_value( ).
APPEND wa_cdata TO cdata.
ENDIF.
ENDDO.
* BREAK-POINT.
ostream = factory->create_ostream_xstring( string = xmloutx ).
IF character_set IS NOT INITIAL.
encoding = ifxml->create_encoding( byte_order = 0 character_set = character_set ).
ostream->set_encoding( encoding = encoding ).
ENDIF.
IF pretty IS NOT INITIAL.
ostream->set_pretty_print( pretty_print = pretty ).
ENDIF.
document->render( ostream = ostream ).
xmlout = cl_abap_codepage=>convert_from( xmloutx ).
ENDFUNCTION.