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.           生成

<?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?]
                                        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.           解析

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.

[SAP ABAP开发技术总结]ABAP读写、解析XML文件相关推荐

  1. [SAP ABAP开发技术总结]ABAP调优——Open SQL优化

    11.1.     数据库编程方面优化 1.   不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2.   不要使 ...

  2. [SAP ABAP开发技术总结]ABAP调优——代码优化

    11.2.     程序 1.   READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH读取标准内表使用二分查找 2.   在循环(LOOP AT ...WHE ...

  3. 解析XML文件——SAX解析技术

    通常的文件等等都是以xml形式存储的,当我们要查看时就必须将他们解析出来.通常有nSimple API for XML(SAX) :nDocument Object Model(DOM)(不建议使用) ...

  4. Android实例RSS客户端开发(2)--解析XML文件

    一 介绍完RSS之后,下面开始讲解如何解析RSS文件.因为RSS是基于XML的,所以我们就直接介绍如何解析XML文件. 解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模 ...

  5. python解析xml数据_数据开发_Python解析XML文件

    解析XML文件 XML是可扩展标记语言,主要用于传输和存储数据 解析方式 使用lxml解析 主要注意: text tag attrib 使用方式 有 get() 以及迭代的情况 数据示例 a31 代码 ...

  6. 一、dom4j技术--使用dom4j解析xml文件

    dom4j解析xml文件 一.导包,编写bean类和测试类 二.编码测试,通过dom4j生成bean对象 books.xml <?xml version="1.0" enco ...

  7. Java解析xml文件dom4j篇(基于xml配置文件完成Excel数据的导入、导出功能完整实现)

    DOM4J解析XML文件 dom4j是一个Java的XML API,是jdom的升级产品,用来读写XML文件.另外对比其他API读写XML文件,dom4j是一个十分优秀的JavaXML API,具有性 ...

  8. java stax xml_Java小知识:使用Stax解析xml文件

    问题: 通过使用Stax解析xml文件时,出现以下错误消息: 线程"主"中的异常javax.xml.stream.XMLStreamException:[row,col]:[86, ...

  9. c语言 自己编程解析 xml,C语言解析.XML文件

    最近手头上有个活在忙,中间很重要的一部分就是用C语言将.XML文件中想要的key和value读出来,与之前已有的值进行比较. 核心的.XML文件的格式如下: zzz xxx yyy 而我的思路是这样的 ...

最新文章

  1. 使用文本用户界面(NMTUI)进行网络配置
  2. git 拉取远程分支及修改远程仓库地址
  3. 秒杀多线程第十一篇 读者写者问题
  4. 如何在 SAP CRM WebClient UI 里在 Context node 上下文里访问其他 Context Node 的数据
  5. ctrl c 失效了_[安卓+PC双端]超C女仆无馬中字
  6. mounted钩子函数_怎样实现Vue中mounted钩子函数获取节点高度
  7. 为什么要序列化Serialization
  8. Spark数据倾斜是如何造成的
  9. KindEditor富文本编辑从数据库取出来内容回显在页面上会自动增加行间距以及回车换行会自动间距变大的问题...
  10. 串口屏与6050_MPU6050 STM32控制 六轴传感器,可通过串口屏显示,还可连接匿名上位机 欧拉角 SCM 单片 发 267万源代码下载- www.pudn.com...
  11. 常用EXE文件反编译工具
  12. 高一计算机基础知识课程ppt课件,高一计算机基础课件.ppt
  13. 【职场日语】日文简历模板
  14. hbase时间同步造成region severs的问题
  15. Latex中插入多张图片,实现并排排列或者多行多列排列
  16. 高级程序员到底长什么样子?
  17. 医院借力泛微:落地高效、合规的数字化内控管理系统
  18. 【AI教程】AI基础学习笔记(第3天)
  19. 基于单片机的智能电子秤系统设计(#0507)
  20. 【Appium踩坑】Encountered internal error running command: Error executing adbExec.

热门文章

  1. bytes用str转还是用decode
  2. vim格式粘贴错乱的解决办法
  3. 如何改变本地git的根目录
  4. nessus rpm 安装_CentOS8.0下查看已安装的软件位置
  5. 如何实现运行时刻的多态?(c++)
  6. 【数据中台】你的企业是否需要建设数据中台?
  7. 信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理2
  8. 笔记-中项案例题-2020年下-立项管理
  9. Python中使用高德API实现经纬度转地名
  10. Winform中设置DevExpress的RadioGroup的items从配置文件中加载