cancel
Showing results for 
Search instead for 
Did you mean: 

What is the meaning of main and stream factory in XML parsing?

Former Member
0 Kudos

What is the exact meaning (i.e. concept) of main and stream factory in XML parsing?

[I am aware of steps involved in XML parsing using iXML library..|http://help.sap.com/saphelp_nw04/helpdata/en/86/8280cf12d511d5991b00508b6b8b11/content.htm], so pls dont explain these steps again.. I have been searching in internet for concepts of these factories, but could not get them anywhere..

Accepted Solutions (1)

Accepted Solutions (1)

stefan_grube
Active Contributor
0 Kudos

In principle a factory is a class to create instances of another class.

So the main factory helps to create an instance of a class wich is a factory also.

Answers (5)

Answers (5)

thiago_pereira
Explorer
0 Kudos

*----

-


  • Tipos Pools

*----

-


TYPE-POOLS: ixml.

CLASS cl_ixml DEFINITION LOAD.

TYPES: BEGIN OF xml_node_type,

node TYPE char50,

vlnode TYPE string,

END OF xml_node_type,

BEGIN OF xml_line_type,

data(256) TYPE x,

END OF xml_line_type.

*----

-


  • Tabelas Internas

*----

-


DATA: ti_xml_node TYPE TABLE OF xml_node_type.

*----

-


  • Variáveis TYPE REF

*----

-


*Type REF para utilizar no XML

DATA: ixml_type TYPE REF TO if_ixml,

streamfactory_type TYPE REF TO if_ixml_stream_factory,

ostream_type TYPE REF TO if_ixml_ostream,

istream_type TYPE REF TO if_ixml_istream,

parser_type TYPE REF TO if_ixml_parser,

renderer_type TYPE REF TO if_ixml_renderer,

document_type TYPE REF TO if_ixml_document,

encoding_type TYPE REF TO if_ixml_encoding,

node_type TYPE REF TO if_ixml_node,

element_dtrans_type TYPE REF TO if_ixml_element,

element_xml_in_type TYPE REF TO if_ixml_element,

element_roteiros_type TYPE REF TO if_ixml_element,

element_roteiro_type TYPE REF TO if_ixml_element,

element_vias_type TYPE REF TO if_ixml_element,

element_via_type TYPE REF TO if_ixml_element,

element_dummy_type TYPE REF TO if_ixml_element,

gw_xml_node TYPE TABLE OF xml_node_type,

gw_xml_node_ret TYPE TABLE OF xml_node_type,

gw_xml_node_err TYPE TABLE OF xml_node_type,

gw_xml_node_xml TYPE TABLE OF xml_node_type,

gw_xml_table TYPE TABLE OF xml_line_type,

gw_xml_table2 TYPE TABLE OF xml_line_type,

gs_xml_node TYPE xml_node_type, "WA para leitura do xml

gs_xml_node_ret TYPE xml_node_type, "WA para leitura do xml retorno

gs_xml_node_err TYPE xml_node_type, "WA para leitura do xml erro

gs_xml_node_xml TYPE xml_node_type, "WA para leitura do xml info sucesso

gs_xml_table2 TYPE xml_line_type. "WA para importar xml

*----

-


  • Variáveis do Programa

*----

-


DATA: l_value TYPE string,

l_rc TYPE i,

l_xml_size TYPE i,

cod_cartaorepom TYPE char20 VALUE '123456789',

v_caminho_exp TYPE string VALUE 'C:TEMP',

v_salvaarquivo TYPE string,

v_nomearquivo TYPE string,

w_nodetext TYPE string,

v_roteiros TYPE string,

v_roteiro TYPE string,

v_roteiro_codigo TYPE string,

v_percurso_codigo TYPE string,

v_percurso_descricao TYPE string,

v_cidade_origem TYPE string,

v_estado_origem TYPE string,

v_cidade_destino TYPE string,

v_estado_destino TYPE string,

v_transporte_tipo TYPE string,

v_cartao_taxa TYPE string,

v_cobra_taxa TYPE string.

*----

-


  • Constants

*----

-


CONSTANTS: cc_39 TYPE string VALUE '39', " Numero 39.

cc_dt_trans TYPE string VALUE 'data_transfer'," document_type(name)

cc_metodo_cod TYPE string VALUE 'metodo_codigo'," document_type(name)

cc_xml_in TYPE string VALUE 'xml_in'," document_type(name)

cc_ct_tx_ativ TYPE string VALUE 'cartao_taxa_ativacao'," document_type(name)

cc_cartao TYPE string VALUE 'cartao', " Parâmetro Perform.

cc_xml TYPE string VALUE '.XML'," extenção

cc_bin TYPE char10 VALUE 'BIN'." filetype

START-OF-SELECTION.

PERFORM yf_inicia_criacao_xml USING cc_39.

element_roteiro_type = document_type->create_simple_element(

name = cc_ct_tx_ativ

parent = element_xml_in_type ).

PERFORM yf_dummy_roteiro USING cod_cartaorepom cc_cartao.

PERFORM yf_finaliza_xml.

PERFORM yf_exporta_xml USING v_caminho_exp.

PERFORM yf_convert_xml_to_itab TABLES gw_xml_node_ret

USING v_salvaarquivo.

END-OF-SELECTION.

*&----


*

*& Form yf_inicia_criacao_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_inicia_criacao_xml USING value(p_0783).

DATA: s_encoding_type TYPE string VALUE 'ISO-8859-1'.

  • Cria o ixml factory

ixml_type = cl_ixml=>create( ).

*Cria o objeto com modelo

document_type = ixml_type->create_document( ).

*Cria o cabeçalho encoding="iso-8859-1"

encoding_type = ixml_type->create_encoding( byte_order = 0

character_set = s_encoding_type ).

*Cria o root "DATA_TRANSFER"

element_dtrans_type = document_type->create_simple_element(

name = cc_dt_trans

parent = document_type ).

*Cria o node "METODO_CODIGO" e preenche com um valor passado no L_VALUE

l_value = p_0783.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = cc_metodo_cod

value = l_value

parent = element_dtrans_type ).

*Cria o node "XML_IN"

element_xml_in_type = document_type->create_simple_element(

name = cc_xml_in

parent = element_dtrans_type ).

ENDFORM. " yf_inicia_criacao_xml

*&----


*

*& Form yf_dummy_roteiro

*&----


*

  • text

*----


*

  • -->VALUE(P_0996) text

  • -->VALUE(P_0997) text

*----


*

FORM yf_dummy_roteiro USING value(p_0996)

value(p_0997).

l_value = p_0996.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = p_0997

value = l_value

parent = element_roteiro_type ).

ENDFORM. " yf_dummy_roteiro

*&----


*

*& Form yf_finaliza_xml

*&----


*

  • text

*----


*

FORM yf_finaliza_xml.

*Cria o stream factory

streamfactory_type = ixml_type->create_stream_factory( ).

*Conecta a internal table de XML com o stream factory

ostream_type = streamfactory_type->create_ostream_itable( table = gw_xml_table ).

CALL METHOD ostream_type->set_encoding

EXPORTING

encoding = encoding_type.

*Rendering the document

renderer_type = ixml_type->create_renderer( ostream = ostream_type

document = document_type ).

l_rc = renderer_type->render( ).

*Salva o documento XML

l_xml_size = ostream_type->get_num_written_raw( ).

ENDFORM. " yf_finaliza_xml

*&----


*

*& Form yf_exporta_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_exporta_xml USING value(p_0783).

CONCATENATE cod_cartaorepom

sy-datum

sy-uzeit

cc_xml

INTO v_nomearquivo.

CONCATENATE p_0783

v_nomearquivo

INTO v_salvaarquivo.

TRANSLATE v_nomearquivo TO UPPER CASE.

*Exporta o XML

CALL METHOD cl_gui_frontend_services=>gui_download

EXPORTING

bin_filesize = l_xml_size

filename = v_salvaarquivo

filetype = cc_bin

CHANGING

data_tab = gw_xml_table

EXCEPTIONS

OTHERS = 24.

IF sy-subrc = 0.

  • PERFORM yf_sapgui_progress_indicator USING cc_msg_xml_ok.

ELSE.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " yf_exporta_xml

*&----


*

*& Form yf_convert_xml_to_itab

*&----


*

  • text

*----


*

  • -->P_GW_XML_NODE_RET text

  • -->P_FILENAME text

*----


*

FORM yf_convert_xml_to_itab TABLES p_gw_xml_node_ret LIKE gw_xml_node

USING p_filename.

DATA l_count.

ixml_type = cl_ixml=>create( ).

  • Now Create Stream Factory

streamfactory_type = ixml_type->create_stream_factory( ).

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = p_filename

filetype = cc_bin

IMPORTING

filelength = l_xml_size

CHANGING

data_tab = gw_xml_table2

EXCEPTIONS

OTHERS = 19.

IF sy-subrc = 0.

istream_type = streamfactory_type->create_istream_itable( table = gw_xml_table2

size = l_xml_size ).

document_type = ixml_type->create_document( ).

parser_type = ixml_type->create_parser( stream_factory = streamfactory_type

istream = istream_type

document = document_type ).

IF parser_type->parse( ) NE 0.

IF parser_type->num_errors( ) NE 0.

l_count = parser_type->num_errors( ).

ENDIF.

ENDIF.

CALL METHOD istream_type->close( ).

CLEAR istream_type.

node_type = document_type.

PERFORM yf_get_data USING node_type.

p_gw_xml_node_ret[] = gw_xml_node[].

CLEAR gw_xml_node[].

ENDIF.

ENDFORM. " yf_convert_xml_to_itab

*&----


*

*& Form yf_get_data

*&----


*

  • text

*----


*

  • -->VALUE(X_NODE) text

*----


*

FORM yf_get_data USING value(x_node) TYPE REF TO if_ixml_node.

DATA: indent TYPE i.

DATA: ptext TYPE REF TO if_ixml_text.

DATA: string TYPE string.

DATA: temp_string(100).

CASE x_node->get_type( ).

WHEN if_ixml_node=>co_node_element.

string = x_node->get_name( ).

w_nodetext = string.

CLEAR string.

string = x_node->get_value( ).

IF NOT w_nodetext IS INITIAL OR

NOT string IS INITIAL.

gs_xml_node-node = w_nodetext.

gs_xml_node-vlnode = string.

IF NOT gs_xml_node-vlnode IS INITIAL.

APPEND gs_xml_node TO gw_xml_node.

CLEAR gs_xml_node.

ENDIF.

ENDIF.

ENDCASE.

  • Get the next child

x_node = x_node->get_first_child( ).

  • Recurse

WHILE NOT x_node IS INITIAL.

PERFORM yf_get_data USING x_node.

x_node = x_node->get_next( ).

ENDWHILE.

ENDFORM. "yf_get_data

thiago_pereira
Explorer
0 Kudos

*----

-


  • Tipos Pools

*----

-


TYPE-POOLS: ixml.

CLASS cl_ixml DEFINITION LOAD.

TYPES: BEGIN OF xml_node_type,

node TYPE char50,

vlnode TYPE string,

END OF xml_node_type,

BEGIN OF xml_line_type,

data(256) TYPE x,

END OF xml_line_type.

*----

-


  • Tabelas Internas

*----

-


DATA: ti_xml_node TYPE TABLE OF xml_node_type.

*----

-


  • Variáveis TYPE REF

*----

-


*Type REF para utilizar no XML

DATA: ixml_type TYPE REF TO if_ixml,

streamfactory_type TYPE REF TO if_ixml_stream_factory,

ostream_type TYPE REF TO if_ixml_ostream,

istream_type TYPE REF TO if_ixml_istream,

parser_type TYPE REF TO if_ixml_parser,

renderer_type TYPE REF TO if_ixml_renderer,

document_type TYPE REF TO if_ixml_document,

encoding_type TYPE REF TO if_ixml_encoding,

node_type TYPE REF TO if_ixml_node,

element_dtrans_type TYPE REF TO if_ixml_element,

element_xml_in_type TYPE REF TO if_ixml_element,

element_roteiros_type TYPE REF TO if_ixml_element,

element_roteiro_type TYPE REF TO if_ixml_element,

element_vias_type TYPE REF TO if_ixml_element,

element_via_type TYPE REF TO if_ixml_element,

element_dummy_type TYPE REF TO if_ixml_element,

gw_xml_node TYPE TABLE OF xml_node_type,

gw_xml_node_ret TYPE TABLE OF xml_node_type,

gw_xml_node_err TYPE TABLE OF xml_node_type,

gw_xml_node_xml TYPE TABLE OF xml_node_type,

gw_xml_table TYPE TABLE OF xml_line_type,

gw_xml_table2 TYPE TABLE OF xml_line_type,

gs_xml_node TYPE xml_node_type, "WA para leitura do xml

gs_xml_node_ret TYPE xml_node_type, "WA para leitura do xml retorno

gs_xml_node_err TYPE xml_node_type, "WA para leitura do xml erro

gs_xml_node_xml TYPE xml_node_type, "WA para leitura do xml info sucesso

gs_xml_table2 TYPE xml_line_type. "WA para importar xml

*----

-


  • Variáveis do Programa

*----

-


DATA: l_value TYPE string,

l_rc TYPE i,

l_xml_size TYPE i,

cod_cartaorepom TYPE char20 VALUE '123456789',

v_caminho_exp TYPE string VALUE 'C:TEMP',

v_salvaarquivo TYPE string,

v_nomearquivo TYPE string,

w_nodetext TYPE string,

v_roteiros TYPE string,

v_roteiro TYPE string,

v_roteiro_codigo TYPE string,

v_percurso_codigo TYPE string,

v_percurso_descricao TYPE string,

v_cidade_origem TYPE string,

v_estado_origem TYPE string,

v_cidade_destino TYPE string,

v_estado_destino TYPE string,

v_transporte_tipo TYPE string,

v_cartao_taxa TYPE string,

v_cobra_taxa TYPE string.

*----

-


  • Constants

*----

-


CONSTANTS: cc_39 TYPE string VALUE '39', " Numero 39.

cc_dt_trans TYPE string VALUE 'data_transfer'," document_type(name)

cc_metodo_cod TYPE string VALUE 'metodo_codigo'," document_type(name)

cc_xml_in TYPE string VALUE 'xml_in'," document_type(name)

cc_ct_tx_ativ TYPE string VALUE 'cartao_taxa_ativacao'," document_type(name)

cc_cartao TYPE string VALUE 'cartao', " Parâmetro Perform.

cc_xml TYPE string VALUE '.XML'," extenção

cc_bin TYPE char10 VALUE 'BIN'." filetype

START-OF-SELECTION.

PERFORM yf_inicia_criacao_xml USING cc_39.

element_roteiro_type = document_type->create_simple_element(

name = cc_ct_tx_ativ

parent = element_xml_in_type ).

PERFORM yf_dummy_roteiro USING cod_cartaorepom cc_cartao.

PERFORM yf_finaliza_xml.

PERFORM yf_exporta_xml USING v_caminho_exp.

PERFORM yf_convert_xml_to_itab TABLES gw_xml_node_ret

USING v_salvaarquivo.

END-OF-SELECTION.

*&----


*

*& Form yf_inicia_criacao_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_inicia_criacao_xml USING value(p_0783).

DATA: s_encoding_type TYPE string VALUE 'ISO-8859-1'.

  • Cria o ixml factory

ixml_type = cl_ixml=>create( ).

*Cria o objeto com modelo

document_type = ixml_type->create_document( ).

*Cria o cabeçalho encoding="iso-8859-1"

encoding_type = ixml_type->create_encoding( byte_order = 0

character_set = s_encoding_type ).

*Cria o root "DATA_TRANSFER"

element_dtrans_type = document_type->create_simple_element(

name = cc_dt_trans

parent = document_type ).

*Cria o node "METODO_CODIGO" e preenche com um valor passado no L_VALUE

l_value = p_0783.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = cc_metodo_cod

value = l_value

parent = element_dtrans_type ).

*Cria o node "XML_IN"

element_xml_in_type = document_type->create_simple_element(

name = cc_xml_in

parent = element_dtrans_type ).

ENDFORM. " yf_inicia_criacao_xml

*&----


*

*& Form yf_dummy_roteiro

*&----


*

  • text

*----


*

  • -->VALUE(P_0996) text

  • -->VALUE(P_0997) text

*----


*

FORM yf_dummy_roteiro USING value(p_0996)

value(p_0997).

l_value = p_0996.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = p_0997

value = l_value

parent = element_roteiro_type ).

ENDFORM. " yf_dummy_roteiro

*&----


*

*& Form yf_finaliza_xml

*&----


*

  • text

*----


*

FORM yf_finaliza_xml.

*Cria o stream factory

streamfactory_type = ixml_type->create_stream_factory( ).

*Conecta a internal table de XML com o stream factory

ostream_type = streamfactory_type->create_ostream_itable( table = gw_xml_table ).

CALL METHOD ostream_type->set_encoding

EXPORTING

encoding = encoding_type.

*Rendering the document

renderer_type = ixml_type->create_renderer( ostream = ostream_type

document = document_type ).

l_rc = renderer_type->render( ).

*Salva o documento XML

l_xml_size = ostream_type->get_num_written_raw( ).

ENDFORM. " yf_finaliza_xml

*&----


*

*& Form yf_exporta_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_exporta_xml USING value(p_0783).

CONCATENATE cod_cartaorepom

sy-datum

sy-uzeit

cc_xml

INTO v_nomearquivo.

CONCATENATE p_0783

v_nomearquivo

INTO v_salvaarquivo.

TRANSLATE v_nomearquivo TO UPPER CASE.

*Exporta o XML

CALL METHOD cl_gui_frontend_services=>gui_download

EXPORTING

bin_filesize = l_xml_size

filename = v_salvaarquivo

filetype = cc_bin

CHANGING

data_tab = gw_xml_table

EXCEPTIONS

OTHERS = 24.

IF sy-subrc = 0.

  • PERFORM yf_sapgui_progress_indicator USING cc_msg_xml_ok.

ELSE.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " yf_exporta_xml

*&----


*

*& Form yf_convert_xml_to_itab

*&----


*

  • text

*----


*

  • -->P_GW_XML_NODE_RET text

  • -->P_FILENAME text

*----


*

FORM yf_convert_xml_to_itab TABLES p_gw_xml_node_ret LIKE gw_xml_node

USING p_filename.

DATA l_count.

ixml_type = cl_ixml=>create( ).

  • Now Create Stream Factory

streamfactory_type = ixml_type->create_stream_factory( ).

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = p_filename

filetype = cc_bin

IMPORTING

filelength = l_xml_size

CHANGING

data_tab = gw_xml_table2

EXCEPTIONS

OTHERS = 19.

IF sy-subrc = 0.

istream_type = streamfactory_type->create_istream_itable( table = gw_xml_table2

size = l_xml_size ).

document_type = ixml_type->create_document( ).

parser_type = ixml_type->create_parser( stream_factory = streamfactory_type

istream = istream_type

document = document_type ).

IF parser_type->parse( ) NE 0.

IF parser_type->num_errors( ) NE 0.

l_count = parser_type->num_errors( ).

ENDIF.

ENDIF.

CALL METHOD istream_type->close( ).

CLEAR istream_type.

node_type = document_type.

PERFORM yf_get_data USING node_type.

p_gw_xml_node_ret[] = gw_xml_node[].

CLEAR gw_xml_node[].

ENDIF.

ENDFORM. " yf_convert_xml_to_itab

*&----


*

*& Form yf_get_data

*&----


*

  • text

*----


*

  • -->VALUE(X_NODE) text

*----


*

FORM yf_get_data USING value(x_node) TYPE REF TO if_ixml_node.

DATA: indent TYPE i.

DATA: ptext TYPE REF TO if_ixml_text.

DATA: string TYPE string.

DATA: temp_string(100).

CASE x_node->get_type( ).

WHEN if_ixml_node=>co_node_element.

string = x_node->get_name( ).

w_nodetext = string.

CLEAR string.

string = x_node->get_value( ).

IF NOT w_nodetext IS INITIAL OR

NOT string IS INITIAL.

gs_xml_node-node = w_nodetext.

gs_xml_node-vlnode = string.

IF NOT gs_xml_node-vlnode IS INITIAL.

APPEND gs_xml_node TO gw_xml_node.

CLEAR gs_xml_node.

ENDIF.

ENDIF.

ENDCASE.

  • Get the next child

x_node = x_node->get_first_child( ).

  • Recurse

WHILE NOT x_node IS INITIAL.

PERFORM yf_get_data USING x_node.

x_node = x_node->get_next( ).

ENDWHILE.

ENDFORM. "yf_get_data

thiago_pereira
Explorer
0 Kudos

*----

-


  • Tipos Pools

*----

-


TYPE-POOLS: ixml.

CLASS cl_ixml DEFINITION LOAD.

TYPES: BEGIN OF xml_node_type,

node TYPE char50,

vlnode TYPE string,

END OF xml_node_type,

BEGIN OF xml_line_type,

data(256) TYPE x,

END OF xml_line_type.

*----

-


  • Tabelas Internas

*----

-


DATA: ti_xml_node TYPE TABLE OF xml_node_type.

*----

-


  • Variáveis TYPE REF

*----

-


*Type REF para utilizar no XML

DATA: ixml_type TYPE REF TO if_ixml,

streamfactory_type TYPE REF TO if_ixml_stream_factory,

ostream_type TYPE REF TO if_ixml_ostream,

istream_type TYPE REF TO if_ixml_istream,

parser_type TYPE REF TO if_ixml_parser,

renderer_type TYPE REF TO if_ixml_renderer,

document_type TYPE REF TO if_ixml_document,

encoding_type TYPE REF TO if_ixml_encoding,

node_type TYPE REF TO if_ixml_node,

element_dtrans_type TYPE REF TO if_ixml_element,

element_xml_in_type TYPE REF TO if_ixml_element,

element_roteiros_type TYPE REF TO if_ixml_element,

element_roteiro_type TYPE REF TO if_ixml_element,

element_vias_type TYPE REF TO if_ixml_element,

element_via_type TYPE REF TO if_ixml_element,

element_dummy_type TYPE REF TO if_ixml_element,

gw_xml_node TYPE TABLE OF xml_node_type,

gw_xml_node_ret TYPE TABLE OF xml_node_type,

gw_xml_node_err TYPE TABLE OF xml_node_type,

gw_xml_node_xml TYPE TABLE OF xml_node_type,

gw_xml_table TYPE TABLE OF xml_line_type,

gw_xml_table2 TYPE TABLE OF xml_line_type,

gs_xml_node TYPE xml_node_type, "WA para leitura do xml

gs_xml_node_ret TYPE xml_node_type, "WA para leitura do xml retorno

gs_xml_node_err TYPE xml_node_type, "WA para leitura do xml erro

gs_xml_node_xml TYPE xml_node_type, "WA para leitura do xml info sucesso

gs_xml_table2 TYPE xml_line_type. "WA para importar xml

*----

-


  • Variáveis do Programa

*----

-


DATA: l_value TYPE string,

l_rc TYPE i,

l_xml_size TYPE i,

cod_cartaorepom TYPE char20 VALUE '123456789',

v_caminho_exp TYPE string VALUE 'C:TEMP',

v_salvaarquivo TYPE string,

v_nomearquivo TYPE string,

w_nodetext TYPE string,

v_roteiros TYPE string,

v_roteiro TYPE string,

v_roteiro_codigo TYPE string,

v_percurso_codigo TYPE string,

v_percurso_descricao TYPE string,

v_cidade_origem TYPE string,

v_estado_origem TYPE string,

v_cidade_destino TYPE string,

v_estado_destino TYPE string,

v_transporte_tipo TYPE string,

v_cartao_taxa TYPE string,

v_cobra_taxa TYPE string.

*----

-


  • Constants

*----

-


CONSTANTS: cc_39 TYPE string VALUE '39', " Numero 39.

cc_dt_trans TYPE string VALUE 'data_transfer'," document_type(name)

cc_metodo_cod TYPE string VALUE 'metodo_codigo'," document_type(name)

cc_xml_in TYPE string VALUE 'xml_in'," document_type(name)

cc_ct_tx_ativ TYPE string VALUE 'cartao_taxa_ativacao'," document_type(name)

cc_cartao TYPE string VALUE 'cartao', " Parâmetro Perform.

cc_xml TYPE string VALUE '.XML'," extenção

cc_bin TYPE char10 VALUE 'BIN'." filetype

START-OF-SELECTION.

PERFORM yf_inicia_criacao_xml USING cc_39.

element_roteiro_type = document_type->create_simple_element(

name = cc_ct_tx_ativ

parent = element_xml_in_type ).

PERFORM yf_dummy_roteiro USING cod_cartaorepom cc_cartao.

PERFORM yf_finaliza_xml.

PERFORM yf_exporta_xml USING v_caminho_exp.

PERFORM yf_convert_xml_to_itab TABLES gw_xml_node_ret

USING v_salvaarquivo.

END-OF-SELECTION.

*&----


*

*& Form yf_inicia_criacao_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_inicia_criacao_xml USING value(p_0783).

DATA: s_encoding_type TYPE string VALUE 'ISO-8859-1'.

  • Cria o ixml factory

ixml_type = cl_ixml=>create( ).

*Cria o objeto com modelo

document_type = ixml_type->create_document( ).

*Cria o cabeçalho encoding="iso-8859-1"

encoding_type = ixml_type->create_encoding( byte_order = 0

character_set = s_encoding_type ).

*Cria o root "DATA_TRANSFER"

element_dtrans_type = document_type->create_simple_element(

name = cc_dt_trans

parent = document_type ).

*Cria o node "METODO_CODIGO" e preenche com um valor passado no L_VALUE

l_value = p_0783.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = cc_metodo_cod

value = l_value

parent = element_dtrans_type ).

*Cria o node "XML_IN"

element_xml_in_type = document_type->create_simple_element(

name = cc_xml_in

parent = element_dtrans_type ).

ENDFORM. " yf_inicia_criacao_xml

*&----


*

*& Form yf_dummy_roteiro

*&----


*

  • text

*----


*

  • -->VALUE(P_0996) text

  • -->VALUE(P_0997) text

*----


*

FORM yf_dummy_roteiro USING value(p_0996)

value(p_0997).

l_value = p_0996.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = p_0997

value = l_value

parent = element_roteiro_type ).

ENDFORM. " yf_dummy_roteiro

*&----


*

*& Form yf_finaliza_xml

*&----


*

  • text

*----


*

FORM yf_finaliza_xml.

*Cria o stream factory

streamfactory_type = ixml_type->create_stream_factory( ).

*Conecta a internal table de XML com o stream factory

ostream_type = streamfactory_type->create_ostream_itable( table = gw_xml_table ).

CALL METHOD ostream_type->set_encoding

EXPORTING

encoding = encoding_type.

*Rendering the document

renderer_type = ixml_type->create_renderer( ostream = ostream_type

document = document_type ).

l_rc = renderer_type->render( ).

*Salva o documento XML

l_xml_size = ostream_type->get_num_written_raw( ).

ENDFORM. " yf_finaliza_xml

*&----


*

*& Form yf_exporta_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_exporta_xml USING value(p_0783).

CONCATENATE cod_cartaorepom

sy-datum

sy-uzeit

cc_xml

INTO v_nomearquivo.

CONCATENATE p_0783

v_nomearquivo

INTO v_salvaarquivo.

TRANSLATE v_nomearquivo TO UPPER CASE.

*Exporta o XML

CALL METHOD cl_gui_frontend_services=>gui_download

EXPORTING

bin_filesize = l_xml_size

filename = v_salvaarquivo

filetype = cc_bin

CHANGING

data_tab = gw_xml_table

EXCEPTIONS

OTHERS = 24.

IF sy-subrc = 0.

  • PERFORM yf_sapgui_progress_indicator USING cc_msg_xml_ok.

ELSE.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " yf_exporta_xml

*&----


*

*& Form yf_convert_xml_to_itab

*&----


*

  • text

*----


*

  • -->P_GW_XML_NODE_RET text

  • -->P_FILENAME text

*----


*

FORM yf_convert_xml_to_itab TABLES p_gw_xml_node_ret LIKE gw_xml_node

USING p_filename.

DATA l_count.

ixml_type = cl_ixml=>create( ).

  • Now Create Stream Factory

streamfactory_type = ixml_type->create_stream_factory( ).

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = p_filename

filetype = cc_bin

IMPORTING

filelength = l_xml_size

CHANGING

data_tab = gw_xml_table2

EXCEPTIONS

OTHERS = 19.

IF sy-subrc = 0.

istream_type = streamfactory_type->create_istream_itable( table = gw_xml_table2

size = l_xml_size ).

document_type = ixml_type->create_document( ).

parser_type = ixml_type->create_parser( stream_factory = streamfactory_type

istream = istream_type

document = document_type ).

IF parser_type->parse( ) NE 0.

IF parser_type->num_errors( ) NE 0.

l_count = parser_type->num_errors( ).

ENDIF.

ENDIF.

CALL METHOD istream_type->close( ).

CLEAR istream_type.

node_type = document_type.

PERFORM yf_get_data USING node_type.

p_gw_xml_node_ret[] = gw_xml_node[].

CLEAR gw_xml_node[].

ENDIF.

ENDFORM. " yf_convert_xml_to_itab

*&----


*

*& Form yf_get_data

*&----


*

  • text

*----


*

  • -->VALUE(X_NODE) text

*----


*

FORM yf_get_data USING value(x_node) TYPE REF TO if_ixml_node.

DATA: indent TYPE i.

DATA: ptext TYPE REF TO if_ixml_text.

DATA: string TYPE string.

DATA: temp_string(100).

CASE x_node->get_type( ).

WHEN if_ixml_node=>co_node_element.

string = x_node->get_name( ).

w_nodetext = string.

CLEAR string.

string = x_node->get_value( ).

IF NOT w_nodetext IS INITIAL OR

NOT string IS INITIAL.

gs_xml_node-node = w_nodetext.

gs_xml_node-vlnode = string.

IF NOT gs_xml_node-vlnode IS INITIAL.

APPEND gs_xml_node TO gw_xml_node.

CLEAR gs_xml_node.

ENDIF.

ENDIF.

ENDCASE.

  • Get the next child

x_node = x_node->get_first_child( ).

  • Recurse

WHILE NOT x_node IS INITIAL.

PERFORM yf_get_data USING x_node.

x_node = x_node->get_next( ).

ENDWHILE.

ENDFORM. "yf_get_data

thiago_pereira
Explorer
0 Kudos

*----

-


  • Tipos Pools

*----

-


TYPE-POOLS: ixml.

CLASS cl_ixml DEFINITION LOAD.

TYPES: BEGIN OF xml_node_type,

node TYPE char50,

vlnode TYPE string,

END OF xml_node_type,

BEGIN OF xml_line_type,

data(256) TYPE x,

END OF xml_line_type.

*----

-


  • Tabelas Internas

*----

-


DATA: ti_xml_node TYPE TABLE OF xml_node_type.

*----

-


  • Variáveis TYPE REF

*----

-


*Type REF para utilizar no XML

DATA: ixml_type TYPE REF TO if_ixml,

streamfactory_type TYPE REF TO if_ixml_stream_factory,

ostream_type TYPE REF TO if_ixml_ostream,

istream_type TYPE REF TO if_ixml_istream,

parser_type TYPE REF TO if_ixml_parser,

renderer_type TYPE REF TO if_ixml_renderer,

document_type TYPE REF TO if_ixml_document,

encoding_type TYPE REF TO if_ixml_encoding,

node_type TYPE REF TO if_ixml_node,

element_dtrans_type TYPE REF TO if_ixml_element,

element_xml_in_type TYPE REF TO if_ixml_element,

element_roteiros_type TYPE REF TO if_ixml_element,

element_roteiro_type TYPE REF TO if_ixml_element,

element_vias_type TYPE REF TO if_ixml_element,

element_via_type TYPE REF TO if_ixml_element,

element_dummy_type TYPE REF TO if_ixml_element,

gw_xml_node TYPE TABLE OF xml_node_type,

gw_xml_node_ret TYPE TABLE OF xml_node_type,

gw_xml_node_err TYPE TABLE OF xml_node_type,

gw_xml_node_xml TYPE TABLE OF xml_node_type,

gw_xml_table TYPE TABLE OF xml_line_type,

gw_xml_table2 TYPE TABLE OF xml_line_type,

gs_xml_node TYPE xml_node_type, "WA para leitura do xml

gs_xml_node_ret TYPE xml_node_type, "WA para leitura do xml retorno

gs_xml_node_err TYPE xml_node_type, "WA para leitura do xml erro

gs_xml_node_xml TYPE xml_node_type, "WA para leitura do xml info sucesso

gs_xml_table2 TYPE xml_line_type. "WA para importar xml

*----

-


  • Variáveis do Programa

*----

-


DATA: l_value TYPE string,

l_rc TYPE i,

l_xml_size TYPE i,

cod_cartaorepom TYPE char20 VALUE '123456789',

v_caminho_exp TYPE string VALUE 'C:TEMP',

v_salvaarquivo TYPE string,

v_nomearquivo TYPE string,

w_nodetext TYPE string,

v_roteiros TYPE string,

v_roteiro TYPE string,

v_roteiro_codigo TYPE string,

v_percurso_codigo TYPE string,

v_percurso_descricao TYPE string,

v_cidade_origem TYPE string,

v_estado_origem TYPE string,

v_cidade_destino TYPE string,

v_estado_destino TYPE string,

v_transporte_tipo TYPE string,

v_cartao_taxa TYPE string,

v_cobra_taxa TYPE string.

*----

-


  • Constants

*----

-


CONSTANTS: cc_39 TYPE string VALUE '39', " Numero 39.

cc_dt_trans TYPE string VALUE 'data_transfer'," document_type(name)

cc_metodo_cod TYPE string VALUE 'metodo_codigo'," document_type(name)

cc_xml_in TYPE string VALUE 'xml_in'," document_type(name)

cc_ct_tx_ativ TYPE string VALUE 'cartao_taxa_ativacao'," document_type(name)

cc_cartao TYPE string VALUE 'cartao', " Parâmetro Perform.

cc_xml TYPE string VALUE '.XML'," extenção

cc_bin TYPE char10 VALUE 'BIN'." filetype

START-OF-SELECTION.

PERFORM yf_inicia_criacao_xml USING cc_39.

element_roteiro_type = document_type->create_simple_element(

name = cc_ct_tx_ativ

parent = element_xml_in_type ).

PERFORM yf_dummy_roteiro USING cod_cartaorepom cc_cartao.

PERFORM yf_finaliza_xml.

PERFORM yf_exporta_xml USING v_caminho_exp.

PERFORM yf_convert_xml_to_itab TABLES gw_xml_node_ret

USING v_salvaarquivo.

END-OF-SELECTION.

*&----


*

*& Form yf_inicia_criacao_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_inicia_criacao_xml USING value(p_0783).

DATA: s_encoding_type TYPE string VALUE 'ISO-8859-1'.

  • Cria o ixml factory

ixml_type = cl_ixml=>create( ).

*Cria o objeto com modelo

document_type = ixml_type->create_document( ).

*Cria o cabeçalho encoding="iso-8859-1"

encoding_type = ixml_type->create_encoding( byte_order = 0

character_set = s_encoding_type ).

*Cria o root "DATA_TRANSFER"

element_dtrans_type = document_type->create_simple_element(

name = cc_dt_trans

parent = document_type ).

*Cria o node "METODO_CODIGO" e preenche com um valor passado no L_VALUE

l_value = p_0783.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = cc_metodo_cod

value = l_value

parent = element_dtrans_type ).

*Cria o node "XML_IN"

element_xml_in_type = document_type->create_simple_element(

name = cc_xml_in

parent = element_dtrans_type ).

ENDFORM. " yf_inicia_criacao_xml

*&----


*

*& Form yf_dummy_roteiro

*&----


*

  • text

*----


*

  • -->VALUE(P_0996) text

  • -->VALUE(P_0997) text

*----


*

FORM yf_dummy_roteiro USING value(p_0996)

value(p_0997).

l_value = p_0996.

CONDENSE l_value.

element_dummy_type = document_type->create_simple_element(

name = p_0997

value = l_value

parent = element_roteiro_type ).

ENDFORM. " yf_dummy_roteiro

*&----


*

*& Form yf_finaliza_xml

*&----


*

  • text

*----


*

FORM yf_finaliza_xml.

*Cria o stream factory

streamfactory_type = ixml_type->create_stream_factory( ).

*Conecta a internal table de XML com o stream factory

ostream_type = streamfactory_type->create_ostream_itable( table = gw_xml_table ).

CALL METHOD ostream_type->set_encoding

EXPORTING

encoding = encoding_type.

*Rendering the document

renderer_type = ixml_type->create_renderer( ostream = ostream_type

document = document_type ).

l_rc = renderer_type->render( ).

*Salva o documento XML

l_xml_size = ostream_type->get_num_written_raw( ).

ENDFORM. " yf_finaliza_xml

*&----


*

*& Form yf_exporta_xml

*&----


*

  • text

*----


*

  • -->VALUE(P_0783) text

*----


*

FORM yf_exporta_xml USING value(p_0783).

CONCATENATE cod_cartaorepom

sy-datum

sy-uzeit

cc_xml

INTO v_nomearquivo.

CONCATENATE p_0783

v_nomearquivo

INTO v_salvaarquivo.

TRANSLATE v_nomearquivo TO UPPER CASE.

*Exporta o XML

CALL METHOD cl_gui_frontend_services=>gui_download

EXPORTING

bin_filesize = l_xml_size

filename = v_salvaarquivo

filetype = cc_bin

CHANGING

data_tab = gw_xml_table

EXCEPTIONS

OTHERS = 24.

IF sy-subrc = 0.

  • PERFORM yf_sapgui_progress_indicator USING cc_msg_xml_ok.

ELSE.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " yf_exporta_xml

*&----


*

*& Form yf_convert_xml_to_itab

*&----


*

  • text

*----


*

  • -->P_GW_XML_NODE_RET text

  • -->P_FILENAME text

*----


*

FORM yf_convert_xml_to_itab TABLES p_gw_xml_node_ret LIKE gw_xml_node

USING p_filename.

DATA l_count.

ixml_type = cl_ixml=>create( ).

  • Now Create Stream Factory

streamfactory_type = ixml_type->create_stream_factory( ).

CALL METHOD cl_gui_frontend_services=>gui_upload

EXPORTING

filename = p_filename

filetype = cc_bin

IMPORTING

filelength = l_xml_size

CHANGING

data_tab = gw_xml_table2

EXCEPTIONS

OTHERS = 19.

IF sy-subrc = 0.

istream_type = streamfactory_type->create_istream_itable( table = gw_xml_table2

size = l_xml_size ).

document_type = ixml_type->create_document( ).

parser_type = ixml_type->create_parser( stream_factory = streamfactory_type

istream = istream_type

document = document_type ).

IF parser_type->parse( ) NE 0.

IF parser_type->num_errors( ) NE 0.

l_count = parser_type->num_errors( ).

ENDIF.

ENDIF.

CALL METHOD istream_type->close( ).

CLEAR istream_type.

node_type = document_type.

PERFORM yf_get_data USING node_type.

p_gw_xml_node_ret[] = gw_xml_node[].

CLEAR gw_xml_node[].

ENDIF.

ENDFORM. " yf_convert_xml_to_itab

*&----


*

*& Form yf_get_data

*&----


*

  • text

*----


*

  • -->VALUE(X_NODE) text

*----


*

FORM yf_get_data USING value(x_node) TYPE REF TO if_ixml_node.

DATA: indent TYPE i.

DATA: ptext TYPE REF TO if_ixml_text.

DATA: string TYPE string.

DATA: temp_string(100).

CASE x_node->get_type( ).

WHEN if_ixml_node=>co_node_element.

string = x_node->get_name( ).

w_nodetext = string.

CLEAR string.

string = x_node->get_value( ).

IF NOT w_nodetext IS INITIAL OR

NOT string IS INITIAL.

gs_xml_node-node = w_nodetext.

gs_xml_node-vlnode = string.

IF NOT gs_xml_node-vlnode IS INITIAL.

APPEND gs_xml_node TO gw_xml_node.

CLEAR gs_xml_node.

ENDIF.

ENDIF.

ENDCASE.

  • Get the next child

x_node = x_node->get_first_child( ).

  • Recurse

WHILE NOT x_node IS INITIAL.

PERFORM yf_get_data USING x_node.

x_node = x_node->get_next( ).

ENDWHILE.

ENDFORM. "yf_get_data

Former Member
0 Kudos

Thanks for ur reply..

So the main factory creates an instance of a class that is stream factory, is my understanding correct?

Could u just brief how this factories from iXML library handles parsing process? What is purpose of main factory and stream factory?

baskar_gopalakrishnan2
Active Contributor
0 Kudos

HI

Here is the difference.

Main Factory: It follows singleton pattern. That means there will be one and only one instance of a class exists in the application context or in the java world ..one instance exist in the java virtual machine. This instance can be initiated during start up time of your server. so all other callers (other class instances) use this one and only instance.

Purpose of SIngleton: To reduce memory usage and improve performance. Example: we can load value mapping data in the cache using singleton class or Main Factory so that all the required appllication objects can use this reference object for computing.

Object: an instance of a class.

Stream Factory: This deals with I/O stream. That means dealing with different type of input and output streams

Hope I answered your question.

stefan_grube
Active Contributor
0 Kudos

> So the main factory creates an instance of a class that is stream factory, is my understanding correct?

Yes.

> Could u just brief how this factories from iXML library handles parsing process?

The parsing is done by another class. If you want to use DOM parser, you use class if_ixml_parser.

To create an instance of this class, you use main factory if_ixml.

In principle your program should do following:

- read the data by using a stream

- parse the data

- create output data

- write data to a stream

Check some sample codes to understand this.