Consultor Eletrônico



Kbase P110416: How to write an XML file out with only Line feed characters as a line terminator.
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   01/11/2005
Status: Unverified

GOAL:

How to write an XML file out with only Line feed characters as a line terminator.

GOAL:

How to write out an XML file without a Carriage Return <CR> character as a line terminator.

FIX:


Write the XML file to memory using a mem pointer and then use a procedure to export the XML to a file. For example:

/*--------------------------------------*/
&SCOPED-DEFINE xpTable customer
DEFINE VARIABLE hXML AS HANDLE NO-UNDO.
DEFINE VARIABLE hRoot AS HANDLE NO-UNDO.
DEFINE VARIABLE hFieldName AS HANDLE NO-UNDO.
DEFINE VARIABLE hFieldValue AS HANDLE NO-UNDO.
DEFINE VARIABLE hRecord AS HANDLE NO-UNDO.
DEFINE VARIABLE hText AS HANDLE NO-UNDO.
DEFINE VARIABLE mymem AS MEMPTR NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hField AS HANDLE NO-UNDO.
DEFINE VARIABLE iNumFields AS INTEGER NO-UNDO.
DEFINE VARIABLE iExtents AS INTEGER NO-UNDO.

CREATE X-DOCUMENT hXML.
CREATE X-NODEREF hRoot.
CREATE X-NODEREF hRecord.
CREATE X-NODEREF hFieldName.
CREATE X-NODEREF hFieldValue.
CREATE X-NODEREF hText.
CREATE QUERY hQuery.
CREATE BUFFER hBuffer FOR TABLE "{&xpTable}":U.

hquery:SET-BUFFERS(hBuffer).
hQuery:QUERY-PREPARE("FOR EACH ":U + hBuffer:TABLE + " NO-LOCK":U).
hQuery:QUERY-OPEN().
hQuery:GET-FIRST().

/*Create the Root element with table name as element name*/
hXML:CREATE-NODE(hRoot, hBuffer:TABLE, "ELEMENT":U).
hXML:APPEND-CHILD(hRoot).

/*Get the description value for the specified table and set it as
node attribute*/
FIND FIRST _file WHERE _file._file-name = hBuffer:TABLE NO-LOCK.

IF _file._Desc NE "" THEN
hRoot:SET-ATTRIBUTE("Description":U, _file._Desc).

REPEAT:
/*Create a 'Record' element.*/
hXML:CREATE-NODE(hRecord, "Record":U, "ELEMENT":U).
/*The hText element is used just for create a new line after each element*/

hXML:CREATE-NODE(hText, "", "TEXT":U).
hText:NODE-VALUE = CHR(10) + " ".
hRoot:APPEND-CHILD(hText).
hRoot:APPEND-CHILD(hRecord).

DO iNumFields = 1 TO hBuffer:NUM-FIELDS:
ASSIGN hField = hBuffer:BUFFER-FIELD(iNumFields).
IF hField:EXTENT > 0 THEN
DO:
REPEAT iExtents = 1 TO hField:EXTENT:
RUN createField (INPUT iExtents).
END.
END.
ELSE
RUN createField (INPUT 0).
END. /*DO iNumFields = 1 TO hBuffer:NUM-FIELDS:*/

hXML:CREATE-NODE(hText, "", "TEXT":U).
hText:NODE-VALUE = CHR(10) + " ".
hRecord:APPEND-CHILD(hText).
hQuery:GET-NEXT().

IF hQuery:QUERY-OFF-END THEN LEAVE.
END. /*repeat*/

hXML:CREATE-NODE(hText, "", "TEXT":U).
hText:NODE-VALUE = CHR(10) + " ".
hRoot:APPEND-CHILD(hText).

hXML:SAVE("memptr":U, mymem).
RUN saveMemptr2File (INPUT mymem, INPUT "customerX.xml").
SET-SIZE(mymem) = 0.

PROCEDURE createField:
DEFINE INPUT PARAMETER iExtent AS INTEGER NO-UNDO.
/*In order to improve performance decrease the .xml file size the fields with a "" value will be not added as element*/
IF hField:EXTENT = 0 THEN
IF hField:BUFFER-VALUE = "" THEN RETURN.

hXML:CRE.ATE-NODE(hText, "", "TEXT":U).
hText:NODE-VALUE = CHR(10) + " ".
hRecord:APPEND-CHILD(hText).

/*Create the field name as element*/
hXML:CREATE-NODE(hFieldName, hField:NAME, 'ELEMENT':U).
IF hField:EXTENT > 0 THEN
hFieldName:SET-ATTRIBUTE("Extent":U, string(iExtent - 1)).

hRecord:APPEND-CHILD(hFieldName).

/*Create the field value as text*/
hXML:CREATE-NODE(hFieldValue, "text":U, 'TEXT':U).
hFieldName:APPEND-CHILD(hFieldValue).
hFieldValue:NODE-VALUE = IF hField:EXTENT = 0 THEN
hField:BUFFER-VALUE ELSE hField:BUFFER-VALUE(iExtent).
END PROCEDURE.

PROCEDURE saveMemptr2File:
DEFINE INPUT PARAMETER ipm_message AS MEMPTR NO-UNDO.
DEFINE INPUT PARAMETER ipc_fileName AS CHARACTER NO-UNDO.
OUTPUT TO VALUE(ipc_fileName) BINARY NO-MAP NO-CONVERT.
EXPORT ipm_message.
OUTPUT CLOSE.
END PROCEDURE.

.