matinal:SAP ABAP 生成XML的例子

REPORT ZXML_A.

SET EXTENDED CHECK OFF.

TYPE-POOLS: IXML.

*&---------------------------------------------------------------------*
*& Report  T_DOM_MANIPULATE
*&
*&---------------------------------------------------------------------*
*& shows how to manipulate a dom tree
*&---------------------------------------------------------------------*
***********************************************************
* macros

DEFINE XML.

  WRITE: / 'XML:', &1 COLOR COL_POSITIVE INVERSE.

END-OF-DEFINITION.

*************************************************************
* global data
*
DATA: DOCUMENT  TYPE REF TO IF_IXML_DOCUMENT,

      RET       TYPE I.
*************************************************************
* building a DOM tree from scratch
*

START-OF-SELECTION.

* create the tree
  PERFORM CREATE_DOM CHANGING DOCUMENT.

* print the tree
  ULINE. WRITE: / 'DOCUMENT BEFOR MANIPULATION'.

  PERFORM PRINT_DOM USING DOCUMENT.

* render the tree
  PERFORM MANIP_DOM CHANGING DOCUMENT.

* print the tree
  ULINE. WRITE: / 'DOCUMENT AFTER MANIPULATION'.

  PERFORM PRINT_DOM USING DOCUMENT.

* render the tree
  PERFORM RENDER_DOM CHANGING DOCUMENT.

*&---------------------------------------------------------------------*
*&      Form  create_dom
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_DOCUMENT  text
*----------------------------------------------------------------------*

FORM CREATE_DOM CHANGING DOCUMENT TYPE REF TO IF_IXML_DOCUMENT.

*------------------------------
* document to create
*------------------------------

* <?xml version="1.0"?>

* <order number="4711">

*    <head>

*      <status>confirmed</status>

*      <date format="mm/dd/yyyy">08/15/1999</date>

*    </head>

*    <body>

*      <item pos="10" units="2" price="17">abap-book  </item>

*      <item pos="20" units="1" price="10">sapr3-cdrom</item>

*      <item pos="30" units="5" price="12">coffee     </item>

*    </body>

* </order>

*------------------------------

  DATA:  IXML      TYPE REF TO IF_IXML,

         PARENT    TYPE REF TO IF_IXML_NODE,

         ELEMENT   TYPE REF TO IF_IXML_ELEMENT,

         NODE      TYPE REF TO IF_IXML_NODE,

         RET       TYPE I.

* create the ixml main factory

  IXML = CL_IXML=>CREATE( ).

* create a empty document

  DOCUMENT = IXML->CREATE_DOCUMENT( ).

* create root node <order>                   "根节点!!!!!!!!!!

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'order' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'number' VALUE = '4711' ).

  RET = DOCUMENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* remember <order> node

  PARENT = ELEMENT.

* create node <head>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'head' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* create node <body>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'body' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* find <head> node

  PARENT  = DOCUMENT->FIND_FROM_NAME( NAME = 'head' ).

* create <status>confirmed</status>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'status' ).

  RET = ELEMENT->SET_VALUE( VALUE = 'confirmed' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* create <date format="mm/dd/yyyy">08/15/2001</date>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'date' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'format' VALUE = 'mm/dd/yyyy' ).

  RET = ELEMENT->SET_VALUE( VALUE = '08/15/2001' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* find <body> node

  PARENT = DOCUMENT->FIND_FROM_NAME( NAME = 'body' ).

* create <item pos="10" units="2" price="17">abap-book</item>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'item' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'pos'   VALUE = '10' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'units' VALUE = '2'  ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'price' VALUE = '17' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'st'    VALUE = '1' ).

  RET = ELEMENT->SET_VALUE( VALUE = 'abap-book' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* create <item pos="20" units="1" price="10">sapr3-cdrom</item>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'item' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'pos'   VALUE = '20' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'units' VALUE = '1'  ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'price' VALUE = '10' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'st'    VALUE = '2' ).

  RET = ELEMENT->SET_VALUE( VALUE = 'sapr3-cdrom' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

* create <item pos="30" units="5" price="12">coffee</item>

  ELEMENT = DOCUMENT->CREATE_ELEMENT( NAME = 'item' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'pos'   VALUE = '30' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'units' VALUE = '5'  ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'price' VALUE = '10' ).

  RET = ELEMENT->SET_ATTRIBUTE( NAME = 'st'    VALUE = '3' ).

  RET = ELEMENT->SET_VALUE( VALUE = 'coffee' ).

  RET = PARENT->APPEND_CHILD( NEW_CHILD = ELEMENT ).

ENDFORM.                    " create_dom

*&---------------------------------------------------------------------*
*&      Form  render_dom
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_DOCUMENT  text
*----------------------------------------------------------------------*

FORM RENDER_DOM CHANGING P_DOCUMENT.

*

* render DOM into a string

*

  TYPES: C_LINE(50)    TYPE C.

  DATA:  IXML          TYPE REF TO IF_IXML,

         RENDERER      TYPE REF TO IF_IXML_RENDERER,

         STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY,

         OSTREAM       TYPE REF TO IF_IXML_OSTREAM,

         ENCODING      TYPE REF TO IF_IXML_ENCODING,

         XMLLINE       TYPE C_LINE,

         XMLTAB        TYPE STANDARD TABLE OF C_LINE,

         CHARSET       TYPE STRING,

         SUCCESS       TYPE C.

* create the ixml main factory

  IXML = CL_IXML=>CREATE( ).

* create a streamFactory

  STREAMFACTORY = IXML->CREATE_STREAM_FACTORY( ).

* create a output stream

  OSTREAM = STREAMFACTORY->CREATE_OSTREAM_ITABLE( TABLE = XMLTAB ).

* set an document encoding (optional)

  " charsets: utf-8, utf-16, sap*

  IF NOT CHARSET IS INITIAL.

    ENCODING = IXML->CREATE_ENCODING( CHARACTER_SET = CHARSET

                                      BYTE_ORDER = 0 ).

    SUCCESS  = OSTREAM->SET_ENCODING( ENCODING = ENCODING ).

  ENDIF.

* create a xml renderer

  RENDERER = IXML->CREATE_RENDERER( DOCUMENT = DOCUMENT

                                    OSTREAM  = OSTREAM ).

* render document into output-stream

  IF RENDERER->RENDER( ) <> 0.

*  error

    WRITE: / 'ERROR: document rendering'.

    EXIT.

  ENDIF.

* dump xml table

  ULINE.

  WRITE: /.

  WRITE: / ' RENDERED XML-DATA'.

  WRITE: /.

  LOOP AT XMLTAB INTO XMLLINE.

    XML XMLLINE.

  ENDLOOP.

ENDFORM.                    " render_dom

*---------------------------------------------------------------------*
*       ORM print_tree                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

FORM PRINT_DOM USING DOCUMENT TYPE REF TO IF_IXML_DOCUMENT.

  DATA: NODE      TYPE REF TO IF_IXML_NODE,

        ITERATOR  TYPE REF TO IF_IXML_NODE_ITERATOR,

        NODEMAP   TYPE REF TO IF_IXML_NAMED_NODE_MAP,

        ATTR      TYPE REF TO IF_IXML_NODE,

        NAME      TYPE STRING,

        PREFIX    TYPE STRING,

        VALUE     TYPE STRING,

        INDENT    TYPE I,

        COUNT     TYPE I,

        INDEX     TYPE I.

  CHECK NOT DOCUMENT IS INITIAL.

  NODE = DOCUMENT.

  ULINE.

  WRITE: /.

  WRITE: /' DOM-TREE'.

  WRITE: /.

  IF NODE IS INITIAL. EXIT. ENDIF.

* create a node iterator

  ITERATOR  = NODE->CREATE_ITERATOR( ).

* get current node

  NODE = ITERATOR->GET_NEXT( ).

* loop over all nodes

  WHILE NOT NODE IS INITIAL.

    INDENT = NODE->GET_HEIGHT( ) * 2.

    INDENT = INDENT + 20.

    CASE NODE->GET_TYPE( ).

      WHEN IF_IXML_NODE=>CO_NODE_ELEMENT.

*       element node

        NAME    = NODE->GET_NAME( ).

        NODEMAP = NODE->GET_ATTRIBUTES( ).

        WRITE: / 'ELEMENT  :'.

        WRITE: AT INDENT NAME COLOR COL_POSITIVE INVERSE.

        IF NOT NODEMAP IS INITIAL.

*         attributes

          COUNT = NODEMAP->GET_LENGTH( ).

          DO COUNT TIMES.

            INDEX  = SY-INDEX - 1.

            ATTR   = NODEMAP->GET_ITEM( INDEX ).

            NAME   = ATTR->GET_NAME( ).

            PREFIX = ATTR->GET_NAMESPACE( ).

            VALUE  = ATTR->GET_VALUE( ).

            WRITE: / 'ATTRIBUTE:'.

            WRITE: AT INDENT NAME  COLOR COL_HEADING INVERSE, '=',

                             VALUE COLOR COL_TOTAL   INVERSE.

          ENDDO.

        ENDIF.

      WHEN IF_IXML_NODE=>CO_NODE_TEXT OR

           IF_IXML_NODE=>CO_NODE_CDATA_SECTION.

*       text node

        VALUE  = NODE->GET_VALUE( ).

        WRITE: / 'TEXT     :'.

        WRITE: AT INDENT VALUE COLOR COL_GROUP INVERSE.

    ENDCASE.

*   advance to next node

    NODE = ITERATOR->GET_NEXT( ).

  ENDWHILE.

ENDFORM.                    "traverse_dom

*&---------------------------------------------------------------------*
*&      Form  display_dom
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_DOCUMENT  text
*----------------------------------------------------------------------*

FORM DISPLAY_DOM USING DOCUMENT  TYPE REF TO IF_IXML_DOCUMENT

                       TITEL     LIKE SY-TITLE.

* display document

  CALL FUNCTION 'SDIXML_DOM_TO_SCREEN'
    EXPORTING
      DOCUMENT = DOCUMENT
      TITLE    = TITEL.

ENDFORM.                    " display_dom

*&---------------------------------------------------------------------*
*&      Form  manip_dom
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_DOCUMENT  text
*----------------------------------------------------------------------*

FORM MANIP_DOM CHANGING DOCUMENT TYPE REF TO IF_IXML_DOCUMENT.

*------------------------------

* document now looks like

*------------------------------

* <?xml version="1.0"?>

* <order number="4711">

*    <head>

*      <status>confirmed</status>

*      <date format="mm/dd/yyyy">08/15/1999</date>

*    </head>

*    <body>

*      <item pos="10" units="2" price="17">abap-book  </item>

*      <item pos="20" units="1" price="10">sapr3-cdrom</item>

*      <item pos="30" units="5" price="12">coffee     </item>

*    </body>

* </order>

*------------------------------

  DATA: ORDER  TYPE REF TO IF_IXML_ELEMENT,

        HEAD   TYPE REF TO IF_IXML_ELEMENT,

        BODY   TYPE REF TO IF_IXML_ELEMENT,

        STATUS TYPE REF TO IF_IXML_ELEMENT,

        DATE   TYPE REF TO IF_IXML_ELEMENT.

* using the method find_from_name

  ORDER  = DOCUMENT->FIND_FROM_NAME( NAME = 'order' ).

  HEAD   = DOCUMENT->FIND_FROM_NAME( NAME = 'head' ).

  BODY   = DOCUMENT->FIND_FROM_NAME( NAME = 'body' ).

  STATUS = DOCUMENT->FIND_FROM_NAME( NAME = 'status' ).

  DATE   = DOCUMENT->FIND_FROM_NAME( NAME = 'date' ).

* update <order>

  DATA: OLD TYPE STRING.

  OLD = ORDER->GET_ATTRIBUTE( NAME = 'number' )."old = 4711

  RET = ORDER->SET_ATTRIBUTE( NAME = '赵博良' VALUE = '001' ). " ret = 0

* update <date>

  RET = DATE->SET_ATTRIBUTE( NAME = 'format' VALUE = 'mm-dd-yyyy' ).

  RET = DATE->SET_VALUE( VALUE = '12-01-2000' ).

* update <item>

  DATA: ITEMS  TYPE REF TO IF_IXML_NODE_COLLECTION,

        ITEM   TYPE REF TO IF_IXML_ELEMENT,

        NODE   TYPE REF TO IF_IXML_NODE,

        VAL    TYPE STRING,

        IDX    TYPE I,

        LEN    TYPE I.

  ITEMS = BODY->GET_ELEMENTS_BY_TAG_NAME( NAME = 'item' ).

  LEN = ITEMS->GET_LENGTH( ).

  DO LEN TIMES.

*   get item

    IDX = SY-INDEX - 1.

    IF SY-SAPRL >= '610'."gui 的版本???????

*     REL >= 6.10: we use simple cast

      ITEM ?= ITEMS->GET_ITEM( INDEX = IDX ).

    ELSE.

*     REL < 6.10: explicit query_interface is required

      NODE  = ITEMS->GET_ITEM( INDEX = IDX ).

      ITEM ?= NODE->QUERY_INTERFACE( IID = IXML_IID_ELEMENT ).

    ENDIF.

*   change pos

    VAL = SY-INDEX.

    RET = ITEM->SET_ATTRIBUTE( NAME = 'pos' VALUE = VAL ).

*   remove attr st='X'

    RET = ITEM->REMOVE_ATTRIBUTE( NAME = 'st' ).  "删除了st 节点

*   add attr ln='X'

    RET = ITEM->SET_ATTRIBUTE( NAME = 'idx' VALUE = VAL ).

  ENDDO.

*------------------------------

* document now looks like

*------------------------------

* <?xml version="1.0" ?>

* <order number="4711" type="001">

*   <head>

*     <status>confirmed</status>

*     <date format="mm-dd-yyyy">12-01-2000</date>

*   </head>

*   <body>

*     <item pos="1" units="2" price="17" idx="1">abap-book</item>

*     <item pos="2" units="1" price="10" idx="2">sapr3-cdrom</item>

*     <item pos="3" units="5" price="10" idx="3">coffee</item>

*   </body>

* </order>

*------------------------------

ENDFORM.                    " manip_dom

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成XML文件ABAP程序 REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE REF TO if_ixml_stream_factory, l_ostream TYPE REF TO if_ixml_ostream, l_renderer TYPE REF TO if_ixml_renderer, l_document TYPE REF TO if_ixml_document. DATA:l_element_ArchiveBatch TYPE REF TO if_ixml_element, l_element_BatchNumber TYPE REF TO if_ixml_element, l_element_TotalFiles TYPE REF TO if_ixml_element, l_element_TotalVolumes TYPE REF TO if_ixml_element, l_element_TotalPieces TYPE REF TO if_ixml_element, l_element_Entries TYPE REF TO if_ixml_element, l_element_Entry TYPE REF TO if_ixml_element, l_element_RecordsCombiningType TYPE REF TO if_ixml_element, l_element_FilePath TYPE REF TO if_ixml_element, l_element_SourceFileName TYPE REF TO if_ixml_element, l_element_ClassificationCode TYPE REF TO if_ixml_element, l_element_ElectronicRecordCode TYPE REF TO if_ixml_element, l_value TYPE string, l_name type string. DATA: l_xml_table TYPE TABLE OF xml_line, l_xml_size TYPE i, l_rc TYPE i. START-OF-SELECTION. *Creating a ixml factory l_ixml = cl_ixml=>create( ). *Creating the dom object model l_document = l_ixml->create_document( ). *Fill root node with value ArchiveBatch l_element_ArchiveBatch = l_document->create_simple_element( name = 'ArchiveBatch' parent = l_document ). * clear l_value. * l_value = '"http://www.w3.org/2001/XMLSchema-instance"'. * l_rc = l_element_ArchiveBatch->set_attribute( name = 'xmlns: *xsi' * value = l_value ). * * clear l_value. * concatenate '"D:\dev\vs\projects\AMS\DotNet\Sinopec.Ams.' * 'Integration\bin\Debug\config\AmsIntegration.xsd"' * into l_value. * l_name = 'xsi:noNamespaceSchemaLocation'. * l_rc = l_element_ArchiveBatch->set_attribute( name = l_name *value = l_value ). *BatchNumber l_element_BatchNumber = l_document->create_simple_element( name = 'BatchNumber' value = '20100609001' parent = l_element_ArchiveBatch ). *TotalFiles l_element_TotalFiles = l_document->create_simple_element( name = 'TotalFiles' value = '5' parent = l_element_ArchiveBatch ). *TotalVolumes l_element_TotalVolumes = l_document->create_simple_element( name = 'TotalVolumes' value = '3' parent = l_element_ArchiveBatch ). *TotalPieces l_element_TotalPieces = l_document->create_simple_element( name = 'TotalPieces' value = '5' parent = l_element_ArchiveBatch ). *Entries l_element_Entries = l_document->create_simple_element( name = 'Entries' parent = l_element_ArchiveBatch ). *Entry1 l_element_Entry = l_document->create_simple_element( name = 'Entry' parent = l_element_Entries ). *Entry1下面的子项 *RecordsCombiningType l_element_RecordsCombiningType = l_document->create_simple_element( name = 'RecordsCombiningType' value = 'Volume' parent = l_element_Entry ). *FilePath l_element_FilePath = l_document->create_simple_element( name = 'FilePath' value = '全宗001/目录001/案卷001/档案一.docx' parent = l_element_Entry ). *SourceFileName l_element_SourceFileName = l_document->create_simple_element( name = 'SourceFileName' value = '档案一' parent = l_element_Entry ). *ClassificationCode l_element_ClassificationCode = l_document->create_simple_element( name = 'ClassificationCode' value = 'wenshu' parent = l_element_Entry ). *ElectronicRecordCode l_element_ElectronicRecordCode = l_document->create_simple_element( name = 'ElectronicRecordCode' value = 'BJSH-001' parent = l_element_Entry ). *Entry1 * Creating a stream factory l_streamfactory = l_ixml->create_stream_factory( ). * Connect internal XML table to stream factory l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). * Rendering the document l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). * Saving the XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = 'c:\temp\metas.xml' filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS OTHERS = 24. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值