10-16-2010 11:42 AM
Hi All,
i need to convet the xml to internal table and internal table to xml . As per the customer specific XML schema.
my xml schema is
<AAA_ACS_XML>
<SEGMENT_VALUES>
<SEG_VAL>1100000000000000</SEG_VAL>
<SEG_DESC>*</SEG_DESC>
<SEG_FROM>00000000</SEG_FROM>
<SEG_TO>00000000</SEG_TO>
<SEG_STATUS>UPDATE</SEG_STATUS>
<SEG_INACT_FLAG></SEG_INACT_FLAG>
</SEGMENT_VALUES>
<SEGMENT_VALUES>
<SEG_VAL>1100000000010000</SEG_VAL>
<SEG_DESC>*</SEG_DESC>
<SEG_FROM>00000000</SEG_FROM>
<SEG_TO>00000000</SEG_TO>
<SEG_STATUS>UPDATE</SEG_STATUS>
<SEG_INACT_FLAG></SEG_INACT_FLAG>
</SEGMENT_VALUES>
</AAA_ACS_XML>
i have done the xlst taransformation in strans tcode , as below
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<AAA_ACS_XML>
<xsl:apply-templates select="//SEGMENT_VALUES"/>
</AAA_ACS_XML>
</asx:values>
</asx:abap>
</xsl:template>
<xsl:template match="SEGMENT_VALUES">
<item>
<SEGF1>
<xsl:value-of select="SEG_VAL"/>
</SEGF1>
<SEGF2>
<xsl:value-of select="SEG_DESC"/>
</SEGF2>
<SEGF3>
<xsl:value-of select="SEG_FROM"/>
</SEGF3>
<SEGF4>
<xsl:value-of select="SEG_TO"/>
</SEGF4>
<SEGF5>
<xsl:value-of select="SEG_STATUS"/>
</SEGF5>
<SEGF6>
<xsl:value-of select="SEG_INACT_FLAG"/>
</SEGF6>
</item>
</xsl:template>
</xsl:transform>
in this after item tag <segf1 > is my internal table field , and i tried using the xml tag as <SEG_VAL>. and i did the code in abap as
below
REPORT YV_XML_CONV.
TYPE-POOLS: ABAP.
DATA: gt_result_xml type abap_trans_resbind_tab,
gs_result_xml type abap_trans_resbind.
Table for the XML content
data: gt_xml type standard table of char2048,
gt_xml3 type standard table of char2048,
gt_xml1 type xstring,
gt_xml2 type string,
gv_len type i,
gv_line type i,
gv_file1(100) type c.
For error handling
data: gs_rif_ex type ref to cx_root,
gs_var_text type string.
DATA: BEGIN OF ktab OCCURS 0,
name TYPE string,
price TYPE string,
description TYPE string,
calories TYPE string,
END OF ktab.
DATA: BEGIN OF jtab OCCURS 0,
mcode TYPE string,
dcode TYPE string,
segno TYPE string,
segf1 TYPE string,
segf2 TYPE string,
segf3 TYPE string,
segf4 TYPE string,
segf5 TYPE string,
segf6 TYPE string,
END OF jtab.
DATA: xml_out TYPE string .
DATA : BEGIN OF upl OCCURS 0,
f TYPE xstring,
END OF upl.
DATA : BEGIN OF itab OCCURS 0,
a(100) TYPE c,
END OF itab.
DATA: xmlupl TYPE string .
BREAK-POINT .
*selection screen
selection-screen begin of block b3 with frame.
parameter: p_file1 like dynpread-fieldname lower case DEFAULT '/tmp/final1.xml'.
selection-screen comment /1(30) comm.
selection-screen end of block b3.
gv_file1 = p_file1.
*open file
open dataset gv_file1 for input in binary mode .
Transferring Data
read dataset gv_file1 into gt_xml1.
Closing the File
close dataset gv_file1.
*convert xstring to string
data: l_convout type ref to cl_abap_conv_in_ce,
l_msgstr type string,
ex_len type i.
try.
l_convout = cl_abap_conv_in_ce=>create(
encoding = 'UTF-8'
input = gt_xml1 ).
l_convout->read( importing data = gt_xml2 ).
catch cx_root.
l_msgstr = text-001.
message l_msgstr type 'E'.
endtry.
*convert string to ftext
call function 'SCMS_STRING_TO_FTEXT'
exporting
text = gt_xml2
tables
ftext_tab = gt_xml3.
*convert ftext to text
describe table gt_xml3 lines gv_line.
gv_len = gv_line * 2048.
call function 'SCMS_FTEXT_TO_TEXT'
exporting
input_length = gv_len
tables
ftext_tab = gt_xml3
text_tab = gt_xml.
get reference of jtab into gs_result_xml-value.
gs_result_xml-name = 'GEBIZ_ACS_XML'.
append gs_result_xml to gt_result_xml.
try.
*----
XML
CALL TRANSFORMATION ('YLEARN')
SOURCE XML gt_xml
RESULT tab = jtab[].
(gt_result_xml)
.
catch cx_root into gs_rif_ex.
gs_var_text = gs_rif_ex->get_text( ).
message gs_var_text type 'E'.
endtry.
BREAK-POINT.
But i the value is not populating in to the internal table . i dont know why ,but no error,not going for dump.but internal table is empty . Please let me know . how to do this xlst conversion. if u know other approach also plz tell me .
Reply's are immediately rewarded , if useful.
Thanks
vinoth.v
10-16-2010 3:49 PM
Hello Vinoth
The "itab" within you transformed XML corresponds to element <AAA_ACS_XML>.
Thus, you have to call the result in the XSLT transformation accordingly (see below):
<?xml version="1.0" encoding="ISO-8859-1"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<asx:values>
<AAA_ACS_XML> " <<<
<item>
<SEGF1>1100000000000000</SEGF1>
<SEGF2>*</SEGF2>
<SEGF3>00000000</SEGF3>
<SEGF4>00000000</SEGF4>
<SEGF5>UPDATE</SEGF5>
<SEGF6/>
</item>
<item>
<SEGF1>1100000000010000</SEGF1>
<SEGF2>*</SEGF2>
<SEGF3>00000000</SEGF3>
<SEGF4>00000000</SEGF4>
<SEGF5>UPDATE</SEGF5>
<SEGF6/>
</item>
</AAA_ACS_XML>
</asx:values>
</asx:abap>
Regards
Uwe
...
CALL TRANSFORMATION ('YLEARN')
SOURCE XML gt_xml
RESULT AAA_ACS_XML = jtab[]. " <<< itab = AAA_ACS_XML
...
Regards
Uwe
10-16-2010 3:49 PM
Hello Vinoth
The "itab" within you transformed XML corresponds to element <AAA_ACS_XML>.
Thus, you have to call the result in the XSLT transformation accordingly (see below):
<?xml version="1.0" encoding="ISO-8859-1"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<asx:values>
<AAA_ACS_XML> " <<<
<item>
<SEGF1>1100000000000000</SEGF1>
<SEGF2>*</SEGF2>
<SEGF3>00000000</SEGF3>
<SEGF4>00000000</SEGF4>
<SEGF5>UPDATE</SEGF5>
<SEGF6/>
</item>
<item>
<SEGF1>1100000000010000</SEGF1>
<SEGF2>*</SEGF2>
<SEGF3>00000000</SEGF3>
<SEGF4>00000000</SEGF4>
<SEGF5>UPDATE</SEGF5>
<SEGF6/>
</item>
</AAA_ACS_XML>
</asx:values>
</asx:abap>
Regards
Uwe
...
CALL TRANSFORMATION ('YLEARN')
SOURCE XML gt_xml
RESULT AAA_ACS_XML = jtab[]. " <<< itab = AAA_ACS_XML
...
Regards
Uwe