Skip to Main Content

Integration

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Converting a XML file and load into FML32 buffer in tuxedo 12

Saravana85Sep 17 2018 — edited Sep 18 2018

Hi,

I am working on a POC for my current project which we need to receive a XML through a tuxedo service. In order to parse the received XML in the tuxedo, we chose the XMLTOFML32 conversion since it is offered by tuxedo. Since I am very new to TUXEDO, facing lot of challenges and certainly need a guidance from the tuxedo expertise. Below is my sample XML and my fld defintion table

XML:

<?xml version="1.0" encoding="UTF-8"?>

<POCREQ>

     <INDATA>VALID</INDATA>

     <SERVICE>XMLSERVICE</SERVICE>

     <OUTDATA>TEXT</OUTDATA>

     <PARENT>

          <CHILD1>AAAA</CHILD1>

          <CHILD2>BBBB</CHILD2>

     </PARENT>

</POCREQ>

Field table:

# name          number  type    flags   comments

INDATA           200     string      -      -      

SERVICE        300      string - -

OUTDATA       400      string - -

PARENT         500      fml32 - -

CHILD1           600      string - -

CHILD2           700      string - -

POCREQ        800      fml32 - -

My Code:

______________________________________________________________________________

void XMLSERVICE(TPSVCINFO *rqst)

{

printf("Inside XMLSERVICE in XMLSERVER.c \n");

char *xmlbuf, *fmlbuf;

char *requestfml;

char *responsexml, *responsefml;

char *subfml;

char *stock_name;

char *fldname;

FILE *stock_data;

FLDID32 fieldid = FIRSTFLDID;

FLDID32 lastfieldid = FIRSTFLDID;

FLDOCC32 oc;

FLDLEN32 len = 0;

int fmlrc, rc;

long stock_amount = 0;

float stock_price = 0;

if((xmlbuf = (char *) tpalloc("XML", NULL, XMLMAXSIZE)) == NULL) {

(void) fprintf(stderr,"Error allocating send buffer\n");

exit(1);

}

if((fmlbuf = (char *) tpalloc("FML32", NULL, XMLMAXSIZE)) == NULL) {

(void) fprintf(stderr,"Error allocating receive buffer\n");

tpfree(xmlbuf);

exit(1);

}

if((subfml = (char *) tpalloc("FML32", NULL, XMLMAXSIZE)) == NULL) {

(void) fprintf(stderr,"Error allocating receive buffer\n");

tpfree(xmlbuf);

tpfree(subfml);

exit(1);

}

printf(" SSSSSSSSSSSSSSSS 11111111111 \n");

memset(xmlbuf, NULL, XMLMAXSIZE);

if ((stock_data = fopen("1.xml", "rt")) != NULL) {

fread(xmlbuf, sizeof(char), XMLMAXSIZE, stock_data);

fclose(stock_data);

}

else {

userlog("Can not find xml data file: RES.xml");

}

printf(" SSSSSSSSSSSSSSS 222222222222 [ %s ]\n", xmlbuf);

rc = tpxmltofml32(xmlbuf, NULL, (FBFR32 **) &fmlbuf, NULL, 0);

if(rc == -1) {

userlog("Error convert stock data from XML to FML32");

tpfree(xmlbuf);

tpfree(fmlbuf);

tpreturn(TPFAIL, -1, NULL, 0, 0);

}

printf(" SSSSSSSSSSSSSSS 3333333333333 %d \n", rc);

//strcpy(responsexml, (char *)xmlbuf);

printf(" SSSSSSSSS FML BUF SSSSSS [ %s ] \n", fmlbuf);

requestfml = rqst->data;

//rqst->data = requestfml

printf(" 111111111 REQUEST DATA 11111111 [ %s ] \n", rqst->data);

stock_name = Fgetalloc32((FBFR32 *)requestfml, Fldid32("INDATA"), 0, &len);

printf(" AAAAAAAA DATA AAAAAAAAA %s == [ %d ]\n", stock_name, Fldid32("RESPONSE"));

if ((stock_name == NULL) || (strlen(stock_name) == 0)) {

userlog("Error get request data");

if(stock_name)

free(stock_name);

tpfree(xmlbuf);

tpfree(fmlbuf);

tpreturn(TPFAIL, -1, NULL, 0, 0);

}

responsexml = rqst->data;

do {

fmlrc = Fnext32((FBFR32 *) fmlbuf, &fieldid, &oc, NULL, NULL);

printf("AAAA : fmlrc [ %d ] \n", fmlrc);

printf("AAAA : fieldid [ %d ] \n", fieldid);

printf(" FIELD NAME ====> [ %s ] \n", Fname32(fieldid));

if (fmlrc < 0) {

userlog("Error get stock data");

free(stock_name);

tpfree(xmlbuf);

tpfree(fmlbuf);

tpreturn(TPFAIL, -1, NULL, 0, 0);

}

else if (fmlrc == 0) {

tpreturn(TPSUCCESS, 0, rqst->data, rqst->len, 0);

break;

}

else {

printf( " SSSSSSSSSSSSS ELLLLLSSSSSEEEEEEEE \n");

if ( fieldid == Fldid32("PARENT") ) {

printf( " ________ INSIDE PARENT _______ \n");

subfml = Fgetalloc32((FBFR32 *)fmlbuf, fieldid, oc, &len);

if (subfml) {

printf( " ________ INSIDE PARENT SUBXML  _______ \n");

do{

fmlrc = Fnext32((FBFR32 *) subfml, &fieldid, &oc, NULL, NULL);

printf("AAAA : fmlrc [ %d ] \n", fmlrc);

printf("AAAA : fieldid [ %d ] \n", fieldid);

printf(" FIELD NAME ====> [ %s ] \n", Fname32(fieldid));

if (fmlrc < 0) {

userlog("Error get stock data");

free(stock_name);

tpfree(xmlbuf);

tpfree(fmlbuf);

tpreturn(TPFAIL, -1, NULL, 0, 0);

}else if (fmlrc == 0) {

break;

}

} while(1);

free(subfml);

}

}

}

lastfieldid = fieldid;

} while(1);

/* Return the transformed buffer to the requestor. */

free(stock_name);

tpfree(xmlbuf);

tpfree(fmlbuf);

tpreturn(TPSUCCESS, 0, responsexml, strlen(responsexml), 0);

}

_____________________________________________________________________

Using the above code I couldn't print the CHILD1 & CHILD2 fieldid and value. In other words, I need a sample code to parse a XML which has a parent child combination nodes.

Thanks in advance for your help.

Saravana

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Oct 16 2018
Added on Sep 17 2018
3 comments
371 views