作者:反反复复-念念不忘 | 来源:互联网 | 2023-08-08 11:30
一、将ABAP数据生成XML文件且生成到本地二、将XML文件解析到SAP中三、将XML数据生成字符串四、用XSLT的方式解析、生成XML,自定义XSLT的事务代
一、将ABAP数据生成XML文件且生成到本地
二、将XML文件解析到SAP中
三、将XML数据生成字符串
四、用XSLT的方式解析、生成XML,自定义XSLT的事务代码是strans
五、下面是具体实现代码
type-pools: IXML,ABAP. 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_FLIGHTS type ref to IF_IXML_ELEMENT,L_ELEMENT_AIRLINE type ref to IF_IXML_ELEMENT,L_ELEMENT_FLIGHT type ref to IF_IXML_ELEMENT,L_ELEMENT_DUMMY type ref to IF_IXML_ELEMENT,L_VALUE type STRING. data: L_XML_TABLE type table of XML_LINE,L_XML_SIZE type I,L_RC type I. data: LT_SPFLI type table of SPFLI. data: L_SPFLI type SPFLI.start-of-selection. * Fill the internal tableselect * from SPFLI into table LT_SPFLI.* Sort internal tablesort LT_SPFLI by CARRID.* 生成XML数据loop at LT_SPFLI into L_SPFLI.at first. * Creating a ixml factoryL_IXML &#61; CL_IXML&#61;>CREATE( ). * Creating the dom object modelL_DOCUMENT &#61; L_IXML->CREATE_DOCUMENT( ). * Fill root node with value flowL_ELEMENT_FLIGHTS &#61; L_DOCUMENT->CREATE_SIMPLE_ELEMENT(NAME &#61; &#39;flow&#39;PARENT &#61; L_DOCUMENT ).L_RC &#61; L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME &#61; &#39;KEY&#39; VALUE &#61; &#39;gsgs-cgdd&#39; ).L_RC &#61; L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME &#61; &#39;DES&#39; VALUE &#61; &#39;广深公司-采购订单&#39;).L_RC &#61; L_ELEMENT_FLIGHTS->SET_ATTRIBUTE( NAME &#61; &#39;BAPI&#39; VALUE &#61;&#39;ZBAPI_MM_RK_AFTER_APP&#39; ).L_ELEMENT_AIRLINE &#61; L_DOCUMENT->CREATE_SIMPLE_ELEMENT(NAME &#61; &#39;customform&#39;PARENT &#61; L_ELEMENT_FLIGHTS ).endat.at new CONNID.L_ELEMENT_FLIGHT &#61; L_DOCUMENT->CREATE_SIMPLE_ELEMENT(NAME &#61; &#39;fd&#39;PARENT &#61; L_ELEMENT_AIRLINE ).L_VALUE &#61; L_SPFLI-CONNID.L_RC &#61; L_ELEMENT_FLIGHT->SET_ATTRIBUTE( NAME &#61; &#39;n&#39; VALUE &#61; &#39;flight&#39; ).endat.L_VALUE &#61; L_SPFLI-DEPTIME.L_ELEMENT_DUMMY &#61; L_DOCUMENT->CREATE_SIMPLE_ELEMENT(NAME &#61; &#39;V&#39;VALUE &#61; L_VALUEPARENT &#61; L_ELEMENT_FLIGHT ).endloop. * Creating a stream factoryL_STREAMFACTORY &#61; L_IXML->CREATE_STREAM_FACTORY( ). * Connect internal XML table to stream factoryL_OSTREAM &#61; L_STREAMFACTORY->CREATE_OSTREAM_ITABLE( TABLE &#61; L_XML_TABLE ). * Rendering the documentL_RENDERER &#61; L_IXML->CREATE_RENDERER( OSTREAM &#61; L_OSTREAMDOCUMENT &#61; L_DOCUMENT ).L_RC &#61; L_RENDERER->RENDER( ).************************************************************* * 将xml数据导出到本地 * 取得XML数据大小L_XML_SIZE &#61; L_OSTREAM->GET_NUM_WRITTEN_RAW( ). * 将xml数据导出到本地 * call method CL_GUI_FRONTEND_SERVICES&#61;>GUI_DOWNLOAD * exporting * BIN_FILESIZE &#61; L_XML_SIZE * FILENAME &#61; &#39;E:\flights.xml&#39; * FILETYPE &#61; &#39;BIN&#39; * changing * DATA_TAB &#61; L_XML_TABLE * exceptions * others &#61; 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. **************************************************************************************************************** **--将XML数据导入到内表 * data XMLDATA type XSTRING . * data: RESULT_XML type standard table of SMUM_XMLTB . * data: RETURN type standard table of BAPIRET2 . * data: WA_XML type SMUM_XMLTB. * *如果需要上载XML可以用一下方法 * call function &#39;GUI_UPLOAD&#39; * exporting * FILENAME &#61; &#39;E:\flights.xml&#39; * FILETYPE &#61; &#39;BIN&#39; * importing * FILELENGTH &#61; L_XML_SIZE * tables * DATA_TAB &#61; L_XML_TABLE.**--将XML数据导入到内表 * call function &#39;SCMS_BINARY_TO_XSTRING&#39; * exporting * INPUT_LENGTH &#61; L_XML_SIZE * importing * BUFFER &#61; XMLDATA * tables * BINARY_TAB &#61; L_XML_TABLE * exceptions * FAILED &#61; 1 * others &#61; 2. * * call function &#39;SMUM_XML_PARSE&#39; * exporting * XML_INPUT &#61; XMLDATA * tables * XML_TABLE &#61; RESULT_XML * RETURN &#61; RETURN. * * loop at RESULT_XML into WA_XML . * endloop.************************************************************************************************** *将XML转换成字符串data: W_STRING type XSTRING.data LS_XML type STRING.*将XML转换成字符串call function &#39;SDIXML_DOM_TO_XML&#39;exportingDOCUMENT &#61; L_DOCUMENTimportingXML_AS_STRING &#61; W_STRINGSIZE &#61; L_XML_SIZEtablesXML_AS_TABLE &#61; L_XML_TABLEexceptionsNO_DOCUMENT &#61; 1others &#61; 2.if SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.endif.* 将Xstring转换成二进制 * call function &#39;SCMS_XSTRING_TO_BINARY&#39; * exporting * BUFFER &#61; W_STRING * importing * OUTPUT_LENGTH &#61; L_XML_SIZE * tables * BINARY_TAB &#61; L_XML_TABLE.call function &#39;SCMS_BINARY_TO_STRING&#39;exportingINPUT_LENGTH &#61; L_XML_SIZEimportingTEXT_BUFFER &#61; LS_XMLtablesBINARY_TAB &#61; L_XML_TABLEexceptionsFAILED &#61; 1others &#61; 2.if SY-SUBRC <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.endif. *********************************************************************************************************************************** ** 用XSLT的方式解析、生成XML * data LT_TABLE type standard table of CHAR2048. * data: GT_RESULT_XML type ABAP_TRANS_RESBIND_TAB, * GS_RESULT_XML type ABAP_TRANS_RESBIND. *data lo_oref TYPE REF TO cx_root. * try. * call transformation ID "此ID是transformation&#xff0c;也可以用事务代码strans自定义一个transformation * source xml LT_TABLE * result (GT_RESULT_XML) . * * catch CX_ST_ERROR into LO_OREF. ** LS_MSG-MSGTYP &#61; &#39;E&#39;. ** LS_MSG-MSGNO &#61; &#39;000&#39;. ** LS_MSG-MSGTXT &#61; LO_OREF->GET_TEXT( ). ** append LS_MSG to C_MSGOUT. * endtry. |