设为首页 收藏本站
查看: 1837|回复: 0

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

[复制链接]

尚未签到

发表于 2015-9-22 10:07:02 | 显示全部楼层 |阅读模式
DSC0000.gif
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4265595.html  
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.           生成
DSC0001.png
<?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?] DSC0002.png
                                        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.           解析

DSC0003.png
DSC0004.png
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.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-117091-1-1.html 上篇帖子: 设置SAP migo、mb1b、mb1c中的字段 下篇帖子: SAP 标准课程结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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