본 소스는는 "http://www.riyaz.net/sap/abap-mapping-code-walkthrough/862/" Blog에서 가져온 내용입니다.
Abap Mapping을 테스트 할때 사용 하는 Input XML 데이터는 아래와 같다.
Output XML데이터는 아래와 같다.
기본적으로 Operation Mapping에서 ABAP Mapping을 사용하게 하려면 아래 URL을 참고 해서 옵션을 켜둔다.
ABAP쪽 소스코드는 다음과 같다.
T-CODE "SE80"으로 들어가서 다음 그림과 같이 Class Library를 생성한다.
Class명과 Description을 넣는다.
Class생성후 Interface Tab에 가서 "IF_MAPPING"을 추가 한다.
Interface를 추가하면 Methods Tab에 가보면 IF_MAPOING~EXECUTE 라는 Methods가 생성되는데 더블클릭해서 들어가면 소스를 입력 할 수 있다.
method IF_MAPPING~EXECUTE.
* initialize iXML
TYPE-POOLS: ixml.
CLASS cl_ixml DEFINITION LOAD.
* create iXML factory object
DATA: ixmlfactory TYPE REF TO if_ixml.
ixmlfactory = cl_ixml=>create( ).
* create streamfactory object
DATA: streamfactory TYPE REF TO
if_ixml_stream_factory.
streamfactory = ixmlfactory->create_stream_factory( ).
* create input stream object
DATA: istream TYPE REF TO if_ixml_istream.
istream = streamfactory->create_istream_xstring( source ).
* initialize the input xml document
DATA: idocument TYPE REF TO if_ixml_document.
idocument = ixmlfactory->create_document( ).
* parse the input xml document
DATA: iparser TYPE REF TO if_ixml_parser.
iparser = ixmlfactory->create_parser(
stream_factory = streamfactory
istream = istream
document = idocument ).
iparser->parse( ).
* Getting the Message ID
* Not necessary. Just demonstrating how to access mapping parameters in ABAP mapping.
DATA: l_msgid_ref TYPE string.
DATA : oref TYPE REF TO cx_root.
TRY.
l_msgid_ref = param->get( if_mapping_param=>message_id ).
CATCH cx_sy_ref_is_initial INTO oref.
ENDTRY.
* Reading source XML data
DATA: odocument TYPE REF TO if_ixml_document.
DATA: root TYPE REF TO if_ixml_element.
DATA: msgid TYPE REF TO if_ixml_element.
DATA: person TYPE REF TO if_ixml_element.
DATA: name TYPE REF TO if_ixml_element.
DATA: fname TYPE REF TO if_ixml_node_collection.
DATA: lname TYPE REF TO if_ixml_node_collection.
DATA: bdate TYPE REF TO if_ixml_node_collection.
DATA: firstname TYPE REF TO if_ixml_node.
DATA: lastname TYPE REF TO if_ixml_node.
DATA: birthdate TYPE REF TO if_ixml_node.
DATA: fullname TYPE string.
DATA: str_fname TYPE string.
DATA: str_lname TYPE string.
DATA: fname_iterator TYPE REF TO if_ixml_node_iterator.
DATA: lname_iterator TYPE REF TO if_ixml_node_iterator.
DATA: bdate_iterator TYPE REF TO if_ixml_node_iterator.
DATA: ostream TYPE REF TO if_ixml_ostream.
DATA: renderer TYPE REF TO if_ixml_renderer.
DATA: rc TYPE i.
DATA: len TYPE i.
DATA: idx TYPE i.
fname = idocument->get_elements_by_tag_name( 'Name' ).
lname = idocument->get_elements_by_tag_name( 'Surname' ).
bdate = idocument->get_elements_by_tag_name( 'Birthdate' ).
* create output document
odocument = ixmlfactory->create_document( ).
* create a root node Names
root = odocument->create_simple_element(
name = 'PersonsCompact'
parent = odocument ).
* create element 'MessageID' and add it to the output document
msgid = odocument->create_simple_element(
name = 'MessageID'
value = l_msgid_ref
parent = root ).
* create iterators to iterate over the data elements
fname_iterator = fname->create_iterator( ).
lname_iterator = lname->create_iterator( ).
bdate_iterator = bdate->create_iterator( ).
len = fname->get_length( ).
idx = 0.
WHILE len GT idx.
idx = idx + 1.
* create element 'Person' and add it to the output document
person = odocument->create_simple_element(
name = 'Person'
parent = root ).
firstname = fname_iterator->get_next( ).
lastname = lname_iterator->get_next( ).
birthdate = bdate_iterator->get_next( ).
str_fname = firstname->get_value( ).
str_lname = lastname->get_value( ).
CONCATENATE str_fname str_lname INTO fullname SEPARATED BY space.
* create element 'Name' and add it to the output document
name = odocument->create_simple_element(
name = 'Name'
value = fullname
parent = person ).
* create element 'Birthdate' and add it to the output document
rc = person->append_child( birthdate ).
ENDWHILE.
* create output stream
ostream = streamfactory->create_ostream_xstring( result ).
* create renderer
renderer = ixmlfactory->create_renderer(
ostream = ostream
document = odocument ).
rc = renderer->render( ).
endmethod.
위의 소스를 IF_MAPING~EXECUTE 넣은 후 Active하고 OP에서 다음과 같이 해당 Class 명을 넣으면 끝이다.
'EAI > XI/PI' 카테고리의 다른 글
| [XI/PI] JDBC Adapter 사용시 여러가지 Attributes (0) | 2013.08.12 |
|---|---|
| [XI/PI] JDBC to JDBC Step-by-Step / ASync (0) | 2013.08.12 |
| [XI/PI] ABAP Mapping 사용하기 위한 Exchange Profile Setting (0) | 2013.08.09 |
| [XI/PI] Retry Setting in AE (0) | 2013.08.07 |
| [XI/PI] Introduction to Context Handling in Message Mapping (0) | 2013.08.07 |
