sap系统中xml文件的两种转换方法.docx
《sap系统中xml文件的两种转换方法.docx》由会员分享,可在线阅读,更多相关《sap系统中xml文件的两种转换方法.docx(11页珍藏版)》请在冰豆网上搜索。
sap系统中xml文件的两种转换方法
XML文件的两种转换方法
1,使用ABAP语言在程序中组织生成XML文件
此方法比较繁琐,相当于一行一行的凑出XML文件里面的所有语句.优点是在各个版本的SAP系统中都可以正常工作,不受系统版本限制.
如上面这个XML文件的实现方法如下:
*&---------------------------------------------------------------------*
*&Report Z_BARRY_TEST_XML
*&
*&---------------------------------------------------------------------*
*&ECC通用
*&---------------------------------------------------------------------*
REPORT z_barry_test_xml.
DATA:
BEGINOFitab_matnrOCCURS0,“XML文件中的节点Product
matnrLIKEmara-matnr,
maktxLIKEmakt-maktx,
ENDOFitab_matnr.
DATA:
BEGINOFitab_classOCCURS0,“XML文件中的节点Categorie
classLIKEm_wwgha-class,"部门
kschlLIKEm_wwgha-kschl,"DESC
ENDOFitab_class.
DATA:
l_ixmlTYPEREFTOif_ixml,“XML相关对象定义
l_encodingTYPEREFTOif_ixml_encoding,“XMLCodepage对象
l_commentTYPEREFTOif_ixml_comment,“XML注释对象
l_docTYPEREFTOif_ixml_document,“XML文件对象
l_rootTYPEREFTOif_ixml_element,“XML元素对象
l_itemTYPEREFTOif_ixml_element,
l_elementTYPEREFTOif_ixml_element,
l_attributeTYPEREFTOif_ixml_attribute,“XML属性
l_ostreamTYPEREFTOif_ixml_ostream,
l_factory TYPEREFTOif_ixml_stream_factory.
TYPES:
BEGINOFxml_line,
data(256)TYPEx,
ENDOFxml_line.
DATA:
xml_tableTYPETABLEOFxml_line,
xml_size TYPEi.
DATA:
l_rvalTYPEi.
START-OF-SELECTION.
PERFORMgetdata.
PERFORMcreate_xml.
PERFORMdownload.
*---------------------------------------------------------------------*
* FORMgetdata *
*---------------------------------------------------------------------*
FORMgetdata.
SELECTmatnrmaktxFROMmakt
INTOTABLEitab_matnr
UPTO4ROWS
WHEREspras='1'.
SELECTclasskschlFROMm_wwgha
INTOTABLEitab_class
UPTO4ROWS
WHEREsprasIN('1','E').
DELETEitab_classWHEREclass='0'.
APPENDitab_class."演示空数据
ENDFORM.
*---------------------------------------------------------------------*
* FORMcreate_xml *
*---------------------------------------------------------------------*
FORMcreate_xml.
CLASScl_ixmlDEFINITIONLOAD.
l_ixml=cl_ixml=>create().
CALLMETHODl_ixml->create_encoding“创建Codepage对象
EXPORTING
byte_order =0
character_set='gb2312'
RECEIVING
rval =l_encoding.
CALLMETHODl_ixml->create_document“创建XML文件对象
RECEIVING
rval =l_doc.
CALLMETHODl_doc->set_encoding“为XML文件对象定义Codepage
EXPORTING
encoding=l_encoding .
CALLMETHODl_doc->create_simple_element“创建XML元素对象
EXPORTING
name ='Root'
parent =l_doc
RECEIVING
rval =l_root.
CALLMETHODl_root->set_attribute“定义XML元素对象的数据
EXPORTING
name ='ATTRIBUTE'
value ='sample'
RECEIVING
rval =l_rval.
CALLMETHOD l_doc->create_comment“添加一行注释
EXPORTING
comment='''上面ATTRIBUTE为属性示例'''
RECEIVING
rval =l_comment .
CALLMETHODl_root->append_child“添加子节点(注释行)
EXPORTING
new_child=l_comment
RECEIVING
rval =l_rval.
PERFORMfill_itab2xmlTABLES itab_matnr“添加内表记录
USING 'Products'
'Product'
l_root.
PERFORMfill_itab2xmlTABLES itab_class“添加内表记录
USING 'Categories'
'Categorie'
l_root.
CALLMETHODl_ixml->create_stream_factory
RECEIVING
rval =l_factory .
CALLMETHODl_factory->create_ostream_itable
EXPORTING
table =xml_table
RECEIVING
rval =l_ostream .
CALLMETHODl_doc->render
EXPORTING
ostream = l_ostream
recursive='X' .
CALLMETHODl_ostream->get_num_written_raw
RECEIVING
rval =xml_size.
ENDFORM.
*---------------------------------------------------------------------*
* FORMdownload *
*---------------------------------------------------------------------*
FORMdownload.
CALLFUNCTION'GUI_DOWNLOAD'
EXPORTING
bin_filesize=xml_size
filename ='C:
\'
filetype ='BIN'
TABLES
data_tab =xml_table.
ENDFORM.
*---------------------------------------------------------------------*
* FORMfill_itab *
*---------------------------------------------------------------------*
FORMfill_itab2xmlTABLESintab
USINGnode1nameTYPEstring
node2nameTYPEstring
l_parentTYPEREFTOif_ixml_element.
DATA:
BEGINOFheadtabOCCURS0,
length TYPEi,
decimals TYPEi,
type_kindTYPEc,
name(30) TYPEc,
ENDOFheadtab.
DATAdescr_refTYPEREFTOcl_abap_structdescr.
FIELD-SYMBOLS:
TYPEabap_compdescr,
,
TYPEANY.
DATA:
nTYPEi,
strTYPEstring,
itemnameTYPEstring,
text1TYPEc,
l_nodeTYPEREFTOif_ixml_element,
l_itemTYPEREFTOif_ixml_element.
descr_ref=cl_abap_typedescr=>describe_by_data(intab).
LOOPATdescr_ref->componentsASSIGNING.
MOVE-CORRESPONDINGTOheadtab.
APPENDheadtab.
ENDLOOP.
CALLMETHODl_doc->create_simple_element
EXPORTING
name =node1name
parent =l_parent
RECEIVING
rval =l_node .
DESCRIBETABLEheadtabLINESn.
LOOPATintabASSIGNING.
CALLMETHODl_doc->create_simple_element
EXPORTING
name =node2name
parent =l_node
RECEIVING
rval =l_item .
DOnTIMES.
ASSIGNCOMPONENTsy-indexOFSTRUCTURETO.
str=.
READTABLEheadtabINDEXsy-index.
IFheadtab-type_kind='I'ORheadtab-type_kind='P'
ORheadtab-type_kind='F'.
SEARCHstrFOR'-'.
IFsy-subrc=0ANDsy-fdpos<>0.
SPLITstrAT'-'INTOstrtext1.
CONDENSEstr.
CONCATENATE'-'strINTOstr.
ELSE.
CONDENSEstr.
ENDIF.
ELSE.
* SHIFTstrLEFTDELETINGLEADING'0'.
ENDIF.
itemname=headtab-name.
CALLMETHODl_doc->create_simple_element
EXPORTING
name =itemname
parent =l_item
value =str
RECEIVING
rval =l_element.
ENDDO.
ENDLOOP.
ENDFORM.
2,使用SAP工具Transformation(Tcode:
STRANS)定义转换模板,ABAP组织数据并转换为XML格式.
此方法对SAP版本有限制,只有以上版本才能使用.
执行Tcode:
STRANS,新建一个Transformation.
粘贴如下代码并激活.
transformxmlns:
tt="">
rootname="ROOT"/>
template>
loopname="line"ref=".ROOT">
valueref="$"/>
loopref="$">
value/>
loop>
loop>
template>
transform>
SE38新建下面的程序转换XML文件
REPORTZZITAB_XML.
DATAxml_stringTYPEstring.
DATA:
BEGINOFline,
keyTYPEi,
valuesTYPETABLEOFi,
ENDOFline.
DATAnumTYPEi.
DATAitabLIKETABLEOFline.
DATAresultLIKEitab.
DATA:
BEGINOFit_xmlOCCURS0,
line(100)TYPEc,
ENDOFit_xml.
DATA:
w_lenTYPEi.
DO3TIMES.
CLEARline.
line-key=sy-index+1.
num=line-key**2.
APPENDnumTOline-values.
num=line-key**3.
APPENDnumTOline-values.
num=line-key**4.
APPENDnumTOline-values.
APPENDlineTOitab.
ENDDO.
CALLTRANSFORMATIONZTEST1“调用TRANSFORMATION”ZTEST1”完成转换
SOURCEroot=itab
RESULTXMLxml_string.“此时的XML为长字符串
write:
/'XML转换完毕'.
CALLFUNCTION'SCMS_STRING_TO_FTEXT'“将XML为长字符串转换为内表格式方便下载
EXPORTING
text=xml_string
IMPORTING
length=w_len
TABLES
ftext_tab=it_xml.
write:
/'XML格式转换完毕'.
CALLFUNCTION'GUI_DOWNLOAD'“XML文件下载
EXPORTING
filename='c:
\'
filetype='BIN'
IMPORTING
filelength=w_len
TABLES
data_tab=it_xml.
write:
/'XML文件下载完毕'.
*下面是将XML文件转换为内表格式
*CALLTRANSFORMATIONZTEST1
*SOURCEXMLxml_string
*RESULTroot=result.
*
*write:
/'转换完毕'.