2008 Nov 13 12:31 PM
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.
2008 Nov 13 12:51 PM
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->parse( ).
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.
2008 Nov 13 12:51 PM
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->parse( ).
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
| User | Count |
|---|---|
| 6 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |