Consultor Eletrônico



Kbase 20726: How to Create Records from an XML Document
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   16/06/2008
Status: Verified

GOAL:

How to Create Records from an XML Document

FACT(s) (Environment):

Progress 9.x
OpenEdge 10.x
All Supported Operating Systems

FIX:

In the following example, the table name is the Root element and the field names are the Root child elements:
DEFINE VARIABLE hXML AS HANDLE NO-UNDO.
DEFINE VARIABLE hRoot AS HANDLE NO-UNDO.
DEFINE VARIABLE hRecord AS HANDLE NO-UNDO.
DEFINE VARIABLE hXMLField AS HANDLE NO-UNDO.
DEFINE VARIABLE hFieldValue AS HANDLE NO-UNDO.

DEFINE VARIABLE iNumRecords AS INTEGER NO-UNDO.
DEFINE VARIABLE iNumFields AS INTEGER NO-UNDO.
DEFINE VARIABLE iExtent AS CHARACTER NO-UNDO.

DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hField AS HANDLE NO-UNDO.

CREATE X-DOCUMENT hXML.
CREATE X-NODEREF hRoot.
CREATE X-NODEREF hRecord.
CREATE X-NODEREF hXMLField.
CREATE X-NODEREF hFieldValue.

hXML:LOAD('FILE':U, "{&xpTable}.xml":U , FALSE).

/* Get the root element handle */
hXML:GET-DOCUMENT-ELEMENT(hRoot).

CREATE BUFFER hBuffer FOR TABLE hRoot:NAME.

DO TRANSACTION:

REPEAT iNumRecords = 1 TO hRoot:NUM-CHILDREN:

hRoot:GET-CHILD(hRecord, iNumRecords).
IF hRecord:SUBTYPE NE 'ELEMENT':U THEN NEXT.

hBuffer:BUFFER-CREATE().

REPEAT iNumFields = 1 TO hRecord:NUM-CHILDREN:

/* Get the field element handle */
hRecord:GET-CHILD(hXMLField, iNumFields).

/* In this tree level just the element nodes (Fields) are required */
IF hXMLField:SUBTYPE NE 'ELEMENT':U THEN NEXT.

hField = hBuffer:BUFFER-FIELD(hXMLField:NAME).
iExtent = hXMLField:GET-ATTRIBUTE('Extent').
hXMLField:GET-CHILD(hFieldValue, 1).
IF iExtent = "" THEN
hField:BUFFER-VALUE = hFieldValue:NODE-VALUE.
ELSE
hField:BUFFER-VALUE(INT(iExtent) + 1) = hFieldValue:NODE-VALUE.
END. /* REPEAT iNumFields = 1 TO hRecord:NUM-CHILDREN: */
END. /* REPEAT iNumRecords = 1 TO hRoot:NUM-CHILDREN: */
END. /* DO TRANSACTION: */