Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

XML to ABAP

Former Member
0 Likes
606

hello all,

my requirement is to read an XML file into a structure of type string, for that i have written an XSLT transformations but when am trying to pass the XML file to the parser am getting run time error saying

XSLT_BAD_SOURCE_CONTEXT

CX_XSLT_RUNTIME_ERROR

below is the code for calling XSLT program

TYPES: BEGIN OF ty_xml_line,

data(256) TYPE x,

END OF ty_xml_line.

DATA: gt_in type table of ty_xml_line,

gt_out type string.

DATA: xslt_error TYPE REF TO cx_xslt_exception,

xslt_message TYPE string .

CALL FUNCTION 'GUI_UPLOAD'

EXPORTING

filename = 'T:\Documents and Settings\sgolla\Desktop\xmlorder1.xml'

TABLES

data_tab = gt_in.

TRY .

CALL TRANSFORMATION zord1

SOURCE XML gt_in

RESULT xml_output = gt_out .

CATCH cx_xslt_exception INTO xslt_error.

xslt_message = xslt_error->get_text( ).

ENDTRY.

please help me how to solve it......

thx in advance

Sippy.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
518

REPORT ZSRK_022 .

    • Read XML file from presentation server*

  • Load iXML Lib.

TYPE-POOLS: IXML.

CLASS CL_IXML DEFINITION LOAD.

DATA: G_IXML TYPE REF TO IF_IXML.

DATA: STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY.

DATA: ISTREAM TYPE REF TO IF_IXML_ISTREAM.

DATA: DOCUMENT TYPE REF TO IF_IXML_DOCUMENT.

DATA: PARSER TYPE REF TO IF_IXML_PARSER.

DATA: LV_FILE_URL TYPE RLGRAP-FILENAME.

  • You should provide the parameter for file name

LV_FILE_URL = 'C:input_xml.xml'.

TYPES: BEGIN OF XML_LINE,

DATA(256) TYPE X,

END OF XML_LINE.

TYPES: BEGIN OF TY_HEADER,

CUST_NAME(20) TYPE C,

CARD_NO(20) TYPE C,

TAX_AMOUNT(10) TYPE C,

TOTAL_AMOUNT(10) TYPE C,

END OF TY_HEADER.

TYPES: BEGIN OF TY_ITEM,

ITEM_NO(4) TYPE N,

ITEM_ID(20) TYPE C,

ITEM_TITLE(50) TYPE C,

ITEM_QTY(10) TYPE C,

ITEM_UPRICE(10) TYPE C,

END OF TY_ITEM.

DATA: GV_HEADER TYPE TY_HEADER.

DATA: GT_ITEM TYPE STANDARD TABLE OF TY_ITEM WITH HEADER LINE.

DATA: XML_TABLE TYPE TABLE OF XML_LINE,

XML_TABLE_SIZE TYPE I.

  • The next step is creating the main factory for the iXML library:

G_IXML = CL_IXML=>CREATE( ).

  • Now Create Stream Factory

STREAMFACTORY = G_IXML->CREATE_STREAM_FACTORY( ).

  • upload a file from the client's workstation

CALL FUNCTION 'WS_UPLOAD'

EXPORTING

FILENAME = LV_FILE_URL

FILETYPE = 'BIN'

IMPORTING

FILELENGTH = XML_TABLE_SIZE

TABLES

DATA_TAB = XML_TABLE

EXCEPTIONS

OTHERS = 11.

  • wrap the table containing the file into a stream

ISTREAM = STREAMFACTORY->CREATE_ISTREAM_ITABLE( TABLE = XML_TABLE

SIZE = XML_TABLE_SIZE ).

  • Create XML Document instance

DOCUMENT = G_IXML->CREATE_DOCUMENT( ).

  • Create parser Object

PARSER = G_IXML->CREATE_PARSER( STREAM_FACTORY = STREAMFACTORY

ISTREAM = ISTREAM

DOCUMENT = DOCUMENT ).

  • Parse an XML document into a DOM tree

*parser-&gtparse( ).

  • Parsing Error Processing

IF PARSER->PARSE( ) NE 0.

IF PARSER->NUM_ERRORS( ) NE 0.

DATA: PARSEERROR TYPE REF TO IF_IXML_PARSE_ERROR,

STR TYPE STRING,

I TYPE I,

COUNT TYPE I,

INDEX TYPE I.

COUNT = PARSER->NUM_ERRORS( ).

WRITE: COUNT, ' parse errors have occured:'.

INDEX = 0.

WHILE INDEX < COUNT.

PARSEERROR = PARSER->GET_ERROR( INDEX = INDEX ).

I = PARSEERROR->GET_LINE( ).

WRITE: 'line: ', I.

I = PARSEERROR->GET_COLUMN( ).

WRITE: 'column: ', I.

STR = PARSEERROR->GET_REASON( ).

WRITE: STR.

INDEX = INDEX + 1.

ENDWHILE.

ENDIF.

ENDIF.

  • Close the stream since it �s not needed anymore

CALL METHOD ISTREAM->CLOSE( ).

CLEAR ISTREAM.

DATA : GV_NODE TYPE REF TO IF_IXML_NODE.

DATA : GV_NODETEXT TYPE STRING.

DATA: GV_FIRST_TIME.

GV_FIRST_TIME = 'X'.

GV_NODE = DOCUMENT.

GT_ITEM-ITEM_NO = 1.

PERFORM GET_DATA TABLES GT_ITEM

USING GV_NODE

CHANGING GV_HEADER.

  • Last item is still not added.

APPEND GT_ITEM.

WRITE : GV_HEADER-CUST_NAME,

GV_HEADER-CARD_NO,

GV_HEADER-TAX_AMOUNT,

GV_HEADER-TOTAL_AMOUNT.

LOOP AT GT_ITEM.

WRITE /:.

WRITE : GT_ITEM-ITEM_NO,

GT_ITEM-ITEM_ID,

GT_ITEM-ITEM_TITLE,

GT_ITEM-ITEM_QTY,

GT_ITEM-ITEM_UPRICE.

ENDLOOP.

*----


*

  • FORM Get_data *

*----


*

FORM GET_DATA TABLES YT_ITEM STRUCTURE GT_ITEM

USING VALUE(X_NODE) TYPE REF TO IF_IXML_NODE

CHANGING Y_HEADER TYPE TY_HEADER.

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( ).

GV_NODETEXT = STRING.

WHEN IF_IXML_NODE=>CO_NODE_TEXT.

PTEXT ?= X_NODE->QUERY_INTERFACE( IXML_IID_TEXT ).

IF PTEXT->WS_ONLY( ) IS INITIAL.

STRING = X_NODE->GET_VALUE( ).

CASE GV_NODETEXT.

WHEN 'Customer'.

CLEAR GV_HEADER.

WHEN 'Name'.

MOVE STRING TO GV_HEADER-CUST_NAME.

WHEN 'Cardnum'.

MOVE STRING TO GV_HEADER-CARD_NO.

WHEN 'Tax'.

MOVE STRING TO GV_HEADER-TAX_AMOUNT.

WHEN 'Total'.

MOVE STRING TO GV_HEADER-TOTAL_AMOUNT.

  • Iteam details

WHEN 'ID'.

MOVE STRING TO GT_ITEM-ITEM_ID.

WHEN 'Title'.

MOVE STRING TO TEMP_STRING.

MOVE TEMP_STRING TO GT_ITEM-ITEM_TITLE.

WHEN 'Quantity'.

MOVE STRING TO GT_ITEM-ITEM_QTY.

WHEN 'UnitPrice'.

MOVE STRING TO GT_ITEM-ITEM_UPRICE.

ENDCASE.

ENDIF.

ENDCASE.

IF GV_NODETEXT = 'Customer'.

CLEAR GV_HEADER.

ELSEIF GV_NODETEXT = 'Item'.

IF GV_FIRST_TIME NE 'X'.

APPEND GT_ITEM.

  • clear : gt_item.

GT_ITEM-ITEM_NO = GT_ITEM-ITEM_NO + 1.

ENDIF.

GV_FIRST_TIME = ' '.

ENDIF.

  • Get the next child

X_NODE = X_NODE->GET_FIRST_CHILD( ).

  • Recurse

WHILE NOT X_NODE IS INITIAL.

PERFORM GET_DATA TABLES GT_ITEM

USING X_NODE

CHANGING GV_HEADER.

X_NODE = X_NODE->GET_NEXT( ).

ENDWHILE.

ENDFORM. "get_data

hello all,

my requirement is to read an XML file into a structure of type string, for that i have written an XSLT transformations but when am trying to pass the XML file to the parser am getting run time error saying

XSLT_BAD_SOURCE_CONTEXT

CX_XSLT_RUNTIME_ERROR

below is the code for calling XSLT program

TYPES: BEGIN OF ty_xml_line,

data(256) TYPE x,

END OF ty_xml_line.

DATA: gt_in type table of ty_xml_line,

gt_out type string.

DATA: xslt_error TYPE REF TO cx_xslt_exception,

xslt_message TYPE string .

CALL FUNCTION 'GUI_UPLOAD'

EXPORTING

filename = 'T:\Documents and Settings\sgolla\Desktop\xmlorder1.xml'

TABLES

data_tab = gt_in.

TRY .

CALL TRANSFORMATION zord1

SOURCE XML gt_in

RESULT xml_output = gt_out .

CATCH cx_xslt_exception INTO xslt_error.

xslt_message = xslt_error->get_text( ).

ENDTRY.

please help me how to solve it......

thx in advance

Sippy.

1 REPLY 1
Read only

Former Member
0 Likes
519

REPORT ZSRK_022 .

    • Read XML file from presentation server*

  • Load iXML Lib.

TYPE-POOLS: IXML.

CLASS CL_IXML DEFINITION LOAD.

DATA: G_IXML TYPE REF TO IF_IXML.

DATA: STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY.

DATA: ISTREAM TYPE REF TO IF_IXML_ISTREAM.

DATA: DOCUMENT TYPE REF TO IF_IXML_DOCUMENT.

DATA: PARSER TYPE REF TO IF_IXML_PARSER.

DATA: LV_FILE_URL TYPE RLGRAP-FILENAME.

  • You should provide the parameter for file name

LV_FILE_URL = 'C:input_xml.xml'.

TYPES: BEGIN OF XML_LINE,

DATA(256) TYPE X,

END OF XML_LINE.

TYPES: BEGIN OF TY_HEADER,

CUST_NAME(20) TYPE C,

CARD_NO(20) TYPE C,

TAX_AMOUNT(10) TYPE C,

TOTAL_AMOUNT(10) TYPE C,

END OF TY_HEADER.

TYPES: BEGIN OF TY_ITEM,

ITEM_NO(4) TYPE N,

ITEM_ID(20) TYPE C,

ITEM_TITLE(50) TYPE C,

ITEM_QTY(10) TYPE C,

ITEM_UPRICE(10) TYPE C,

END OF TY_ITEM.

DATA: GV_HEADER TYPE TY_HEADER.

DATA: GT_ITEM TYPE STANDARD TABLE OF TY_ITEM WITH HEADER LINE.

DATA: XML_TABLE TYPE TABLE OF XML_LINE,

XML_TABLE_SIZE TYPE I.

  • The next step is creating the main factory for the iXML library:

G_IXML = CL_IXML=>CREATE( ).

  • Now Create Stream Factory

STREAMFACTORY = G_IXML->CREATE_STREAM_FACTORY( ).

  • upload a file from the client's workstation

CALL FUNCTION 'WS_UPLOAD'

EXPORTING

FILENAME = LV_FILE_URL

FILETYPE = 'BIN'

IMPORTING

FILELENGTH = XML_TABLE_SIZE

TABLES

DATA_TAB = XML_TABLE

EXCEPTIONS

OTHERS = 11.

  • wrap the table containing the file into a stream

ISTREAM = STREAMFACTORY->CREATE_ISTREAM_ITABLE( TABLE = XML_TABLE

SIZE = XML_TABLE_SIZE ).

  • Create XML Document instance

DOCUMENT = G_IXML->CREATE_DOCUMENT( ).

  • Create parser Object

PARSER = G_IXML->CREATE_PARSER( STREAM_FACTORY = STREAMFACTORY

ISTREAM = ISTREAM

DOCUMENT = DOCUMENT ).

  • Parse an XML document into a DOM tree

*parser-&gtparse( ).

  • Parsing Error Processing

IF PARSER->PARSE( ) NE 0.

IF PARSER->NUM_ERRORS( ) NE 0.

DATA: PARSEERROR TYPE REF TO IF_IXML_PARSE_ERROR,

STR TYPE STRING,

I TYPE I,

COUNT TYPE I,

INDEX TYPE I.

COUNT = PARSER->NUM_ERRORS( ).

WRITE: COUNT, ' parse errors have occured:'.

INDEX = 0.

WHILE INDEX < COUNT.

PARSEERROR = PARSER->GET_ERROR( INDEX = INDEX ).

I = PARSEERROR->GET_LINE( ).

WRITE: 'line: ', I.

I = PARSEERROR->GET_COLUMN( ).

WRITE: 'column: ', I.

STR = PARSEERROR->GET_REASON( ).

WRITE: STR.

INDEX = INDEX + 1.

ENDWHILE.

ENDIF.

ENDIF.

  • Close the stream since it �s not needed anymore

CALL METHOD ISTREAM->CLOSE( ).

CLEAR ISTREAM.

DATA : GV_NODE TYPE REF TO IF_IXML_NODE.

DATA : GV_NODETEXT TYPE STRING.

DATA: GV_FIRST_TIME.

GV_FIRST_TIME = 'X'.

GV_NODE = DOCUMENT.

GT_ITEM-ITEM_NO = 1.

PERFORM GET_DATA TABLES GT_ITEM

USING GV_NODE

CHANGING GV_HEADER.

  • Last item is still not added.

APPEND GT_ITEM.

WRITE : GV_HEADER-CUST_NAME,

GV_HEADER-CARD_NO,

GV_HEADER-TAX_AMOUNT,

GV_HEADER-TOTAL_AMOUNT.

LOOP AT GT_ITEM.

WRITE /:.

WRITE : GT_ITEM-ITEM_NO,

GT_ITEM-ITEM_ID,

GT_ITEM-ITEM_TITLE,

GT_ITEM-ITEM_QTY,

GT_ITEM-ITEM_UPRICE.

ENDLOOP.

*----


*

  • FORM Get_data *

*----


*

FORM GET_DATA TABLES YT_ITEM STRUCTURE GT_ITEM

USING VALUE(X_NODE) TYPE REF TO IF_IXML_NODE

CHANGING Y_HEADER TYPE TY_HEADER.

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( ).

GV_NODETEXT = STRING.

WHEN IF_IXML_NODE=>CO_NODE_TEXT.

PTEXT ?= X_NODE->QUERY_INTERFACE( IXML_IID_TEXT ).

IF PTEXT->WS_ONLY( ) IS INITIAL.

STRING = X_NODE->GET_VALUE( ).

CASE GV_NODETEXT.

WHEN 'Customer'.

CLEAR GV_HEADER.

WHEN 'Name'.

MOVE STRING TO GV_HEADER-CUST_NAME.

WHEN 'Cardnum'.

MOVE STRING TO GV_HEADER-CARD_NO.

WHEN 'Tax'.

MOVE STRING TO GV_HEADER-TAX_AMOUNT.

WHEN 'Total'.

MOVE STRING TO GV_HEADER-TOTAL_AMOUNT.

  • Iteam details

WHEN 'ID'.

MOVE STRING TO GT_ITEM-ITEM_ID.

WHEN 'Title'.

MOVE STRING TO TEMP_STRING.

MOVE TEMP_STRING TO GT_ITEM-ITEM_TITLE.

WHEN 'Quantity'.

MOVE STRING TO GT_ITEM-ITEM_QTY.

WHEN 'UnitPrice'.

MOVE STRING TO GT_ITEM-ITEM_UPRICE.

ENDCASE.

ENDIF.

ENDCASE.

IF GV_NODETEXT = 'Customer'.

CLEAR GV_HEADER.

ELSEIF GV_NODETEXT = 'Item'.

IF GV_FIRST_TIME NE 'X'.

APPEND GT_ITEM.

  • clear : gt_item.

GT_ITEM-ITEM_NO = GT_ITEM-ITEM_NO + 1.

ENDIF.

GV_FIRST_TIME = ' '.

ENDIF.

  • Get the next child

X_NODE = X_NODE->GET_FIRST_CHILD( ).

  • Recurse

WHILE NOT X_NODE IS INITIAL.

PERFORM GET_DATA TABLES GT_ITEM

USING X_NODE

CHANGING GV_HEADER.

X_NODE = X_NODE->GET_NEXT( ).

ENDWHILE.

ENDFORM. "get_data