二维码

利用ABAP将内表数据解析成XML字符串

Twilight发表于 2018-08-21 10:47Twilight 最后回复于 2018-08-21 10:47 [复制链接] 3840 0

将ABAP内表数据转成xml格式,SAP提供了TRANSFORMATION工具,就是新建TRANSFORMATION模板,但是这种方法会经常报错发生异常,通常是数据中包含特殊字符,除此模板是固定的也就是说xml节点是固定的,实际项目中空节点我们是不需要传递的,减少报文大小请求更快。

下面是用cl_ixml类的方法实现

1、程序代码
  1. TYPE-POOLS: ixml,abap.
  2. TYPES: BEGIN OF xml_line,
  3.         data(256) TYPE x,
  4.        END OF xml_line.
  5. DATA: l_ixml            TYPE REF TO if_ixml,
  6.       l_streamfactory   TYPE REF TO if_ixml_stream_factory,
  7.       l_ostream         TYPE REF TO if_ixml_ostream,
  8.       l_document        TYPE REF TO if_ixml_document.
  9. DATA: l_element_flights TYPE REF TO if_ixml_element,
  10.       l_element_airline TYPE REF TO if_ixml_element,
  11.       l_element_flight  TYPE REF TO if_ixml_element,
  12.       lv_value          TYPE string.
  13. DATA: lt_xml_table       TYPE TABLE OF xml_line,
  14.       l_xml_size        TYPE i.
  15. DATA: lt_spfli          TYPE TABLE OF spfli.
  16. DATA: lt_spfli_temp     TYPE TABLE OF spfli.
  17. DATA: ls_spfli          TYPE spfli.

  18. START-OF-SELECTION.
  19. *   Fill the internal table
  20.   SELECT * FROM spfli UP TO 10 ROWS INTO TABLE lt_spfli.

  21. *   Sort internal table
  22.   SORT lt_spfli BY carrid.

  23. * 生成XML数据
  24. * Creating a ixml factory
  25.   l_ixml = cl_ixml=>create( ).
  26. * Creating the dom object model
  27.   l_document = l_ixml->create_document( ).
  28. * Fill root node with value flow
  29.   l_element_flights  = l_document->create_simple_element(
  30.               name = 'flights'
  31.               parent = l_document ).
  32.   l_element_flights->set_attribute( name = 'PALNE' value = '航班计划' ).

  33.   LOOP AT lt_spfli INTO ls_spfli.

  34.     APPEND ls_spfli TO lt_spfli_temp.
  35.     AT END OF carrid.
  36.       lv_value = ls_spfli-carrid.
  37.       l_element_airline  = l_document->create_simple_element(
  38.                   name = 'Carrid'
  39.                   parent = l_element_flights  ).
  40.       l_element_airline->set_attribute( name = 'value' value = lv_value ).

  41.       LOOP AT lt_spfli_temp INTO ls_spfli.
  42.         lv_value = ls_spfli-connid.
  43.         l_element_flight  = l_document->create_simple_element(
  44.                     name = 'Connid'
  45.                     value = lv_value
  46.                     parent = l_element_airline  ).
  47.       ENDLOOP.
  48.       CLEAR:lt_spfli_temp[].
  49.     ENDAT.

  50.   ENDLOOP.
  51. *   Creating a stream factory
  52.   l_streamfactory = l_ixml->create_stream_factory( ).
  53. *   Connect internal XML table to stream factory
  54.   l_ostream = l_streamfactory->create_ostream_itable( table = lt_xml_table ).
  55.   l_xml_size = l_ostream->get_num_written_raw( ).

  56. *将XML转换成字符串
  57.   DATA ls_xml TYPE string.

  58.   CALL FUNCTION 'SDIXML_DOM_TO_XML'
  59.     EXPORTING
  60.       document     = l_document
  61.     IMPORTING
  62.       size         = l_xml_size
  63.     TABLES
  64.       xml_as_table = lt_xml_table
  65.     EXCEPTIONS
  66.       no_document  = 1
  67.       OTHERS       = 2.

  68.   CALL FUNCTION 'SCMS_BINARY_TO_STRING'
  69.     EXPORTING
  70.       input_length = l_xml_size
  71.     IMPORTING
  72.       text_buffer  = ls_xml
  73.     TABLES
  74.       binary_tab   = lt_xml_table
  75.     EXCEPTIONS
  76.       failed       = 1
  77.       OTHERS       = 2.
  78.   IF sy-subrc = 0.
  79.     WRITE:ls_xml.
  80.   ENDIF.
复制代码
2、Debug字符串xml格式
XML.jpg

扩展阅读:利用ABAP将XML字符串解析成内表数据
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表