天天看點

另一種ABAP解析XML file的方式

Created by Jerry Wang on Jun 20, 2014

xml 源檔案source code 如下:

<?xml version="1.0"?>
<grid gridtype="16Column2Panel" rows="2 " cols="16 " width="100%">
 <gridcell col="1" row="1" colspan="8">
  <header id="FA163EEF573D1ED3BDD89BC23ABF16C8" textid="FA163EEF573D1ED3BDD89BC23ABF16C8"/>
 </gridcell>
 <gridcell col="1" row="2" colspan="3">
  <label for="//ROLE/VALUE"/>
 </gridcell>
 <gridcell col="4" row="2" colspan="5">
  <picklist id="//ROLE/VALUE" table="//ROLE/VALUE" selection="//ROLE/VALUE" mandatory="" disabled=""/>
 </gridcell>
</grid>
      
REPORT ztool_xml_parse.
DATA: lv_xstring         TYPE xstring.
DATA: lv_xml TYPE string.
DATA: lv_conv_out        TYPE REF TO cl_abap_conv_out_ce.
DATA: lv_reader          TYPE REF TO if_sxml_reader.
DATA: lv_node            TYPE REF TO if_sxml_node.
DATA: lv_open_node       TYPE REF TO if_sxml_open_element.
DATA: lv_close_node      TYPE REF TO if_sxml_close_element.
DATA: lv_value_node      TYPE REF TO if_sxml_value.
DATA: lv_value           TYPE string.
lv_conv_out = cl_abap_conv_out_ce=>create(  ).
lv_xml = zcl_jerry_tool=>get_file_content_by_path( '\\TSHomeServer\TSHome$\i042416\Desktop\lv_xml.xml' ).
lv_conv_out->write( EXPORTING data = lv_xml ).
lv_xstring = lv_conv_out->get_buffer( ).
lv_reader = cl_sxml_string_reader=>create( lv_xstring ).
lv_node = lv_reader->read_next_node( ).
ASSERT lv_node IS NOT INITIAL.
WHILE lv_reader->node_type <> if_sxml_node=>co_nt_final.
  CASE lv_reader->node_type.
    WHEN if_sxml_node=>co_nt_element_open.
      lv_open_node  ?= lv_node.
      WRITE: / 'OpenNode: ' , lv_open_node->qname-name COLOR COL_NEGATIVE.
      DATA(attrs) = lv_open_node->get_attributes( ).
      LOOP AT attrs ASSIGNING FIELD-SYMBOL(<attr>).
        WRITE: / 'Attribute: ' , <attr>->qname-name COLOR COL_TOTAL, ' Value: ' ,  <attr>->get_value( ) COLOR COL_GROUP.
      ENDLOOP.
    WHEN if_sxml_node=>co_nt_element_close.
      lv_close_node ?= lv_node.
      WRITE: / 'CloseNode: ', lv_close_node->qname-name COLOR COL_NEGATIVE.
    WHEN if_sxml_node=>co_nt_value.
      lv_value_node ?= lv_node.
      lv_value = lv_value_node->get_value( ).
      WRITE: / 'ValueNode: ', lv_value COLOR COL_POSITIVE.
    WHEN if_sxml_node=>co_nt_attribute.
  ENDCASE.
  lv_node = lv_reader->read_next_node( ).
ENDWHILE.
      

解析結果:

另一種ABAP解析XML file的方式