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: */