Sap ABAP内表转Xml

对于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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
生成XML文件ABAP程序 REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, 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_ArchiveBatch TYPE REF TO if_ixml_element, l_element_BatchNumber TYPE REF TO if_ixml_element, l_element_TotalFiles TYPE REF TO if_ixml_element, l_element_TotalVolumes TYPE REF TO if_ixml_element, l_element_TotalPieces TYPE REF TO if_ixml_element, l_element_Entries TYPE REF TO if_ixml_element, l_element_Entry TYPE REF TO if_ixml_element, l_element_RecordsCombiningType TYPE REF TO if_ixml_element, l_element_FilePath TYPE REF TO if_ixml_element, l_element_SourceFileName TYPE REF TO if_ixml_element, l_element_ClassificationCode TYPE REF TO if_ixml_element, l_element_ElectronicRecordCode TYPE REF TO if_ixml_element, l_value TYPE string, l_name type string. DATA: l_xml_table TYPE TABLE OF xml_line, l_xml_size TYPE i, l_rc TYPE i. START-OF-SELECTION. *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 ArchiveBatch l_element_ArchiveBatch = l_document->create_simple_element( name = 'ArchiveBatch' parent = l_document ). * clear l_value. * l_value = '"http://www.w3.org/2001/XMLSchema-instance"'. * l_rc = l_element_ArchiveBatch->set_attribute( name = 'xmlns: *xsi' * value = l_value ). * * clear l_value. * concatenate '"D:\dev\vs\projects\AMS\DotNet\Sinopec.Ams.' * 'Integration\bin\Debug\config\AmsIntegration.xsd"' * into l_value. * l_name = 'xsi:noNamespaceSchemaLocation'. * l_rc = l_element_ArchiveBatch->set_attribute( name = l_name *value = l_value ). *BatchNumber l_element_BatchNumber = l_document->create_simple_element( name = 'BatchNumber' value = '20100609001' parent = l_element_ArchiveBatch ). *TotalFiles l_element_TotalFiles = l_document->create_simple_element( name = 'TotalFiles' value = '5' parent = l_element_ArchiveBatch ). *TotalVolumes l_element_TotalVolumes = l_document->create_simple_element( name = 'TotalVolumes' value = '3' parent = l_element_ArchiveBatch ). *TotalPieces l_element_TotalPieces = l_document->create_simple_element( name = 'TotalPieces' value = '5' parent = l_element_ArchiveBatch ). *Entries l_element_Entries = l_document->create_simple_element( name = 'Entries' parent = l_element_ArchiveBatch ). *Entry1 l_element_Entry = l_document->create_simple_element( name = 'Entry' parent = l_element_Entries ). *Entry1下面的子项 *RecordsCombiningType l_element_RecordsCombiningType = l_document->create_simple_element( name = 'RecordsCombiningType' value = 'Volume' parent = l_element_Entry ). *FilePath l_element_FilePath = l_document->create_simple_element( name = 'FilePath' value = '全宗001/目录001/案卷001/档案一.docx' parent = l_element_Entry ). *SourceFileName l_element_SourceFileName = l_document->create_simple_element( name = 'SourceFileName' value = '档案一' parent = l_element_Entry ). *ClassificationCode l_element_ClassificationCode = l_document->create_simple_element( name = 'ClassificationCode' value = 'wenshu' parent = l_element_Entry ). *ElectronicRecordCode l_element_ElectronicRecordCode = l_document->create_simple_element( name = 'ElectronicRecordCode' value = 'BJSH-001' parent = l_element_Entry ). *Entry1 * Creating a stream factory l_streamfactory = l_ixml->create_stream_factory( ). * 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 document = l_document ). l_rc = l_renderer->render( ). * Saving the XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = 'c:\temp\metas.xml' filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS OTHERS = 24. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值