*&---------------------------------------------------------------------*
*& Report YTST_201703_XML002
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT YTST_201703_XML002.
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.
*&s1.上传文件
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.
*&s2.
*(1)create
*(2)create document
*(3)create STREAM FACTORY
*(4)create ISTREAM ITABLE
*(5)create PARSER
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 INDEXGET_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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_NODE text
* -->DEEP text
*----------------------------------------------------------------------*
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. "print_node
*&---------------------------------------------------------------------*
*& Form printnodeinfo
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->NODETYPE text
* -->DEEP text
* -->NODE text
*----------------------------------------------------------------------*
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. "printnodeinfo