Kbase P26744: 4GL: How to use the Microsoft XMLDOM COM object parser to load a database table into an XML file?
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  01/12/2005 |
|
Status: Unverified
GOAL:
How to use the Microsoft XMLDOM COM object parser to load a database table into an XML file?
FACT(s) (Environment):
Windows
Progress 9.x
OpenEdge 10.x
FIX:
/* The following code reads the Customer table from the Progress Sports2000 demo database to an XML file using the "Microsoft.XMLDOM" COM object:
/* Define the "Microsoft.XMLDOM" COM-HANDLE handles */
DEFINE VARIABLE hxml AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE hDocument AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE hTable AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE hRecord AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE hField AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE hText AS COM-HANDLE NO-UNDO.
/* Define Customer Buffer and Current Field Handles */
DEFINE VARIABLE hCustomerBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hCurrentField AS HANDLE NO-UNDO.
/* Counter, Returned Result and NameSpace variables */
DEFINE VARIABLE iFieldNumber AS INTEGER NO-UNDO.
DEFINE VARIABLE lResult AS LOGICAL NO-UNDO.
DEFINE VARIABLE cNameSpaceURI AS CHARACTER NO-UNDO.
/* Instantiate your specific DOM COM object version:*/
/* Version 1: CREATE "Microsoft.XMLDOM" hDocument.*/
/* Version 2: CREATE "Msxml2.DOMDocument" hDocument.*/
/* Version 3: CREATE "MSXML2.DOMDocument.3.0" hDocument.*/
/* Version 4: CREATE "MSXML2.DOMDocument.4.0" hDocument.*/
CREATE "Microsoft.XMLDOM" hDocument.
ASSIGN
cNameSpaceURI = ""
hCustomerBuffer = BUFFER Customer:HANDLE.
/*Create the root element & append it to the document*/
ASSIGN
hxml = hDocument:createProcessingInstruction('xml','version = "1.0"')
lResult = hDocument:appendChild(hxml)
hTable = hDocument:createNode("element", "Customers", cNameSpaceURI)
lResult = hDocument:appendChild(hTable).
/*Populate the XML tree*/
FOR EACH customer NO-LOCK:
ASSIGN
hRecord = hDocument:createNode("element", "Customer", cNameSpaceURI)
lResult = hDocument:documentElement:appendChild (hRecord)
lResult = hRecord:setAttribute ("Customer_Number", STRING(CustNum))
lResult = hRecord:setAttribute ("Customer_Name", NAME).
REPEAT iFieldNumber = 1 TO hCustomerBuffer:NUM-FIELDS:
hCurrentField = hCustomerBuffer:BUFFER-FIELD(iFieldNumber).
IF LOOKUP(hCurrentField:NAME, "CustNum,Name") = 0 THEN
ASSIGN
hField = hDocument:createNode("element", hCurrentField:NAME, cNameSpaceURI)
lResult = hRecord:appendChild (hField)
hText = hDocument:createNode("text", "", cNameSpaceURI)
lResult = hField:appendChild (hText)
hText:nodeValue = hCurrentField:STRING-VALUE.
END.
END.
hDocument:save("C:\WRK91D\Customer.xml").
/* Clear Memory: Release objects, delete handles and set all to unknown */
RELEASE OBJECT hDocument.
RELEASE OBJECT hTable.
RELEASE OBJECT hRecord.
RELEASE OBJECT hField.
RELEASE OBJECT hText.
DELETE OBJECT hCurrentField.
DELETE OBJECT hCustomerBuffer.
ASSIGN
hDocument = ?
hTable = ?
hRecord = ?
hField = ?
hText = ?
hCustomerBuffer = ?
hCurrentField = ?.