How do i read xml file

RealHeavyDude

Well-Known Member
Since you don't talk about the Progress/OpenEdge version you are running I can only advice you to look into the documentation that comes with the product. In reasonable recent versions of Progress/OpenEdge there is a book contained in the documentation which is named "working with XML" - I think that's what your're looking for. Aren't you?

Regards, RealHeavyDude.
 

RealHeavyDude

Well-Known Member
Then you can choose between the DOM and SAX parser. I would recommend you the SAX parser.

Regards, RealHeavyDude.
 

tamhas

ProgressTalk.com Sponsor
SAX-READER for full control, but READ-XML for dead simple cases if the data you are trying to read will map to a temp-table or ProDataSet.
 

paruthi

New Member
- <ReportData>
- <Column>
<Field datatype="integer" format=">>>>9" label="Cust Num" name="CustNum" />

<Field datatype="character" format="x(20)" label="Country" name="Country" />

<Field datatype="character" format="x(30)" label="Name" name="Name" />

<Field datatype="character" format="x(35)" label="Address" name="Address" />

<Field datatype="character" format="x(35)" label="Address2" name="Address2" />

<Field datatype="character" format="x(25)" label="City" name="City" />

<Field datatype="character" format="x(20)" label="State" name="State" />

<Field datatype="character" format="x(10)" label="Postal Code" name="PostalCode" />

<Field datatype="character" format="x(30)" label="Contact" name="Contact" />

<Field datatype="character" format="x(20)" label="Phone" name="Phone" />

<Field datatype="character" format="x(4)" label="Sales Rep" name="SalesRep" />

<Field datatype="decimal" format="->,>>>,>>9" label="Credit Limit" name="CreditLimit" />

<Field datatype="decimal" format="->,>>>,>>9.99" label="Balance" name="Balance" />

<Field datatype="character" format="x(20)" label="Terms" name="Terms" />

<Field datatype="integer" format=">>9%" label="Discount" name="Discount" />

<Field datatype="character" format="x(80)" label="Comments" name="Comments" />

<Field datatype="character" format="x(20)" label="Fax" name="Fax" />

<Field datatype="character" format="x(50)" label="Email" name="EmailAddress" />

</Column>


- <Data>
- <Record>
<CustNum>1</CustNum>

<Country />

<Name>56</Name>

<Address>276 North Drive</Address>

<Address2 />

<City />

<State>MA</State>

<PostalCode>01730</PostalCode>

<Contact />

<Phone>6</Phone>

<SalesRep>HXM</SalesRep>

<CreditLimit>0</CreditLimit>

<Balance>903.64</Balance>

<Terms>Net30</Terms>

<Discount>35</Discount>

<Comments>This customer is on credit hold.</Comments>

<Fax />

<EmailAddress />

</Record>
</Data>
</ReportData>

i want to read this xml file
 

paruthi

New Member
REPEAT iReportCounter = 1 TO xhReport:NUM-CHILDREN:
lReportCheck = xhReport:GET-CHILD(xhColumn,1).
IF NOT lReportCheck THEN LEAVE.

REPEAT iColumnCounter = iReportCounter TO xhColumn:NUM-CHILDREN:

lColumnCheck = xhColumn:GET-CHILD(xhField,2).
cFieldNames = (xhField:ATTRIBUTE-NAMES).
/* DISPLAY cFieldNames. */

END.
REPEAT iDatacounter = 1 TO xhData:NUM-CHILDREN:

xhData:GET-CHILD(xhRecord,3).

REPEAT iRecordCounter = 1 TO xhRecord:NUM-CHILDREN:
ggg:GET-CHILD(xhRecord,4).
/* cRecordValues=(ggg:ATTRIBUTE-NAMES). */

DISPLAY .


END.
END.

END.

I am using this way but reading the <read> tag giving error
can any one help me?
 

paruthi

New Member
RUN pLoadDataFromXml.

/******************************Load the data from xml*********************/

PROCEDURE pLoadDataFromXml:

/* *************************** Definitions *************************** */

DEFINE VARIABLE xhDoc AS HANDLE NO-UNDO.
DEFINE VARIABLE xhReport AS HANDLE NO-UNDO.
DEFINE VARIABLE xhColumn AS HANDLE NO-UNDO.
DEFINE VARIABLE xhField AS HANDLE NO-UNDO.
DEFINE VARIABLE xhData AS HANDLE NO-UNDO.
DEFINE VARIABLE xhRecord AS HANDLE NO-UNDO.
DEFINE VARIABLE xhValues AS HANDLE NO-UNDO.
DEFINE VARIABLE iDatacounter AS INTEGER NO-UNDO .
DEFINE VARIABLE iRecordcounter AS INTEGER NO-UNDO .
DEFINE VARIABLE iReportCounter AS INTEGER NO-UNDO.
DEFINE VARIABLE iColumnCounter AS INTEGER NO-UNDO.
DEFINE VARIABLE iSeq AS INTEGER NO-UNDO INIT 1000.
DEFINE VARIABLE cFieldNames AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFieldValue AS CHARACTER NO-UNDO.
DEFINE VARIABLE cRecodValue AS CHARACTER NO-UNDO.
DEFINE VARIABLE cDataType AS CHARACTER NO-UNDO.
DEFINE VARIABLE cColumnName AS CHARACTER NO-UNDO.
DEFINE VARIABLE tthDisplay AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hDisplayValue AS HANDLE NO-UNDO.
DEFINE VARIABLE xhTextValue AS HANDLE NO-UNDO.
DEFINE VARIABLE cTextValue AS CHARACTER NO-UNDO.
DEFINE VARIABLE hBufferField AS HANDLE NO-UNDO EXTENT 18.
DEFINE VARIABLE lReportCheck AS LOGICAL NO-UNDO.
DEFINE VARIABLE lColumnCheck AS LOGICAL NO-UNDO.

/*****************Create the Nodes *******************/
CREATE X-DOCUMENT xhDoc.
CREATE X-NODEREF xhReport.
CREATE X-NODEREF xhColumn.
CREATE X-NODEREF xhField.
CREATE X-NODEREF xhData.
CREATE X-NODEREF xhRecord.
CREATE X-NODEREF xhValues.
CREATE X-NODEREF xhTextValue.

/***************DATA FROM XML ***********/



xhDoc:LOAD("file","c:\customer.xml",FALSE).
xhDoc:GET-DOCUMENT-ELEMENT(xhReport).

/*Get the Report Node child */
lReportCheck = xhReport:GET-CHILD(xhColumn,1).

/*Create the Temp Table*/
CREATE TEMP-TABLE tthDisplay.

REPEAT iColumnCounter = 1 TO xhColumn:NUM-CHILDREN:
/*Get the Column Values */
lColumnCheck = xhColumn:GET-CHILD(xhField,iColumnCounter).
/* IF xhField:NUM-CHILDREN < 1 THEN LEAVE. */
/* Read the values of column node */
cFieldNames = (xhField:ATTRIBUTE-NAMES).
cDataType= xhField:GET-ATTRIBUTE(ENTRY(1, cFieldNames)).

cColumnName=xhField:GET-ATTRIBUTE(ENTRY(4, cFieldNames)).
/* MESSAGE cColumnName VIEW-AS ALERT-BOX.*/
/* Add the dynamic table columns */
tthDisplay:ADD-NEW-FIELD(cColumnName,cDataType).


END.
/*Create the sequence for row*/
/* tthDisplay:ADD-NEW-FIELD("Sequence", "INTEGER",0,"9999",1000).*/
/* */
/* tthDisplay:ADD-NEW-INDEX("SeqIndex", YES). */
/* tthDisplay:ADD-INDEX-FIELD("SeqIndex", "Sequence"). */

/* Prepare the temp table */
tthDisplay:TEMP-TABLE-PREPARE("DynamicTable").
/*CREATE BUFFER hBuffer FOR TABLE tthDisplay:DEFAULT-BUFFER-HANDLE.*/
/*Get the default buffer for table*/
hBuffer =tthDisplay:DEFAULT-BUFFER-HANDLE.

DISPLAY hBuffer:NAME FORMAT "x(20)".
/***Get the Data Column ***/
lReportCheck = xhReport:GET-CHILD(xhData,2).
REPEAT iDatacounter= 1 TO xhData:NUM-CHILDREN:
/*create the buffer */
hBuffer:BUFFER-CREATE().

xhData:GET-CHILD(xhRecord,iDatacounter).
/* Get the Record Columns */
REPEAT iRecordcounter = 1 TO xhRecord:NUM-CHILDREN:

xhRecord:GET-CHILD(xhValues,iRecordcounter).
IF xhValues:NUM-CHILDREN < 1 THEN NEXT.
/*Read the column name*/
cRecodValue =STRING(xhValues:NAME).
hDisplayValue=hBuffer:BUFFER-FIELD(xhValues:NAME) .
xhValues:GET-CHILD(xhTextValue,1).
/*Assign the value to that column */
cTextValue =xhTextValue:NODE-VALUE.
hDisplayValue:BUFFER-VALUE = cTextValue .
END. /*Repeat xhRecord */
/* hBuffer:BUFFER-FIELD("Sequence"):BUFFER-VALUE = iSeq.*/
/* iSeq = iSeq + 1. */

END. /* Repeat xhData */

/*****create the query *****/
CREATE QUERY hQuery.
/* set buffer to query */
hQuery:SET-BUFFERS(hBuffer).
/***Query prepare statement***/
hQuery:QUERY-PREPARE("FOR EACH " + hBuffer:NAME).
hQuery:QUERY-OPEN().
/***Read the values from query***/
hQuery:GET-FIRST(NO-LOCK).
REPEAT WHILE NOT hQuery:QUERY-OFF-END:
REPEAT iReportCounter = 1 TO hBuffer:NUM-FIELDS:
/***Set the column name from buffer**/
hBufferField[iReportCounter]=hBuffer:BUFFER-FIELD(iReportCounter).
DISPLAY hBufferField[iReportCounter]:NAME STRING(hBufferField[iReportCounter]:BUFFER-VALUE).
END.
hQuery:GET-NEXT(NO-LOCK).
END. /***end of hquery ***/

hBuffer:BUFFER-RELEASE().
hQuery:QUERY-CLOSE().
/**** Delete objects****/
DELETE OBJECT xhDoc.
DELETE OBJECT xhColumn.
DELETE OBJECT xhData.
DELETE OBJECT xhField.
DELETE OBJECT xhRecord.
DELETE OBJECT xhReport.
DELETE OBJECT xhValues.
DELETE OBJECT hQuery.

END PROCEDURE.


Finaly i did my question

Thanks every one
 
Top