[SAP ABAP开发技术总结]ABAP读取写XML文件

目录导航

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!
原文出自:

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.

时间: 2024-12-14 20:31:26

[SAP ABAP开发技术总结]ABAP读取写XML文件的相关文章

[SAP ABAP开发技术总结]ABAP程序之间数据共享与传递

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 19.             数据共享与传递... 222 19.1.         程序调用.会话.SAP/ABAP内存 关系... 222 19.2.         ABAP Memory数据共享... 224 19.2.1.     EXPORT. 224 19.2.2.     IMPORT. 226 19.2.3.     DELETE. 227 19.3

[SAP ABAP开发技术总结]客户端文本文件、Excel文件上传下载

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 客户端文本文件或Excel文件导入与导出... 1 TEXT_CONVERT_XLS_TO_SAP. 1 ALSM_EXCEL_TO_INTERNAL_TABLE. 3 SAP_CONVERT_TO_XLS_FORMAT. 5 客户端文本文件或Excel文件导入与导出 TEXT_CONVERT_XLS_TO_SAP TEXT_CONVERT_XLS_TO_SAP函数可以将

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

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 11.1.     数据库编程方面优化 1.   不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2.   不要使用SELECT DISTINCT ...,会绕过缓存,可使用 SORT BY + DELETE ADJACENT DUPLICATES 代替 3.   少用相关子查询,因为子

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

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 11.2.     程序 1.   READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH读取标准内表使用二分查找 2.   在循环(LOOP AT ...WHERE..)或查询(READ TABLE ...)某内表时,如果未使用索引(排序表.哈希表)或二分查找,则在查询组合字段创建第二索引,查询时通过USE KEY或WITH [TA

[SAP ABAP开发技术总结]ABAP常用事务码

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: SE16N 业务顾问表数据查询工具  日志分析 SM13:查看Update Table更新(当使用V3更新时)  入站处理代码 CS11逐层显示BOM CS12 多层显示BOM ME11创建采购信息记录,类似销售里的条件记录VK11, 物料号+采购组织+供应商+工厂(可选)决定一条 Info Record MIGO 入库.收货 MMBE 按公司.工厂.库位.批次,库存分类汇总显示

Dom4j 读取一个XML文件和将String写成XML文件

dom4j保存文件xml格式和读取XML文件内容,代码如下: package com.qmjs.imut import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentHelper; i

QT开发(四十五)——XML文件解析总结

QT开发(四十五)--XML文件解析总结 一.XML文件解析方式的特点 1.DOM解析XML文档的特点 基于DOM的解析器的核心是在内存中建立和XML文档相对应的树状结构.XML文件的标记.标记中的文本数据和实体等都是内存中的树状结构的某个节点相对应. 优点:可以方便地操作内存中的树状节点 缺点:如果XML文件较大,或者只需要解析XML文档的一部分数据,就会占用大量的内存空间 2.SAX解析XML文档的特点 SAX解析的核心是事件处理机制,SAX采用事件机制的方式来解析XML文档.使用SAX解析

UWP 读取本地XML文件

读取本地XML文件时要将xxx.xml文件的“生成操作”改为“嵌入的资源”会比较好,在手机上运行的话需要改为“内容” <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata

02_Android写xml文件和读xml文件

?? 新建Android项目 编写AndroidManifest.xml,使本Android项目具有单元测试功能和写外设的权限. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima28.xmldemo" a