Consultor Eletrônico



Kbase P187732: Using the EXPORT statement generates invalid XML from a longchar.
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   16/05/2011
Status: Unverified

SYMPTOM(s):

Using the EXPORT statement generates invalid XML from a longchar.

The EXPORT statement writes XML with the XML code page between exclamation marks.

The following code generates the invalid XML.

DEFINE VARIABLE vFilename AS CHARACTER NO-UNDO.
DEFINE VARIABLE vTestProd AS CHARACTER NO-UNDO.
DEFINE VARIABLE vConflict-Id AS CHARACTER NO-UNDO.
DEFINE VARIABLE vSysPath AS CHARACTER NO-UNDO.
DEFINE VARIABLE hSAXWriter AS HANDLE NO-UNDO.
DEFINE VARIABLE vLog AS LOGICAL NO-UNDO.
DEFINE VARIABLE vSendXML AS LONGCHAR NO-UNDO.
DEFINE VARIABLE vDebug AS LOGICAL NO-UNDO INIT FALSE.
DEFINE VARIABLE hDoc AS HANDLE NO-UNDO.
/* Keep vFilename empty when using LONGCHAR */
vFilename = "" /*"test-file.xml"*/.
FIX-CODEPAGE(vSendXML) = 'iso8859-1'.
CREATE SAX-WRITER hSAXWriter.
hSAXWriter:FORMATTED = TRUE.
hSAXWriter:ENCODING = "ISO-8859-1".
IF vFileName = "" THEN
vLog = hSAXWriter:SET-OUTPUT-DESTINATION("longchar", vSendXML).
ELSE
vLog = hSAXWriter:SET-OUTPUT-DESTINATION("file", vFilename).
vLog = hSAXWriter:START-DOCUMENT().
vLog = hSAXWriter:START-ELEMENT("transfer").
vLog = hSAXWriter:INSERT-ATTRIBUTE("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance").
vLog = hSAXWriter:START-ELEMENT("record").
vLog = hSAXWriter:INSERT-ATTRIBUTE("conflict-id", vConflict-Id).
vLog = hSAXWriter:INSERT-ATTRIBUTE("unionno", "4").
vLog = hSAXWriter:INSERT-ATTRIBUTE("memberno", "1").
vLog = hSAXWriter:INSERT-ATTRIBUTE("birthday", "01.01.1960").
vLog = hSAXWriter:START-ELEMENT("mobile").
vLog = hSAXWriter:WRITE-DATA-ELEMENT("mobileno", "12345678").
vLog = hSAXWriter:WRITE-DATA-ELEMENT("mobilestamp", STRING(NOW)).
vLog = hSAXWriter:WRITE-DATA-ELEMENT("mobileby", "nn").
vLog = hSAXWriter:END-ELEMENT("mobile").
vLog = hSAXWriter:END-ELEMENT("record").
vLog = hSAXWriter:END-ELEMENT("transfer").
vLog = hSAXWriter:END-DOCUMENT().
DELETE OBJECT hSAXWriter.
IF vFilename = "" THEN DO:
OUTPUT TO test-longchar.xml.
EXPORT vSendXML.
OUTPUT CLOSE.
END.

The resulting XML looks like:

!ISO8859-1!<?xml version="1.0" encoding="ISO-8859-1"?>
<transfer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record conflict-id="" unionno="4" memberno="1" birthday="01.01.1960">
<mobile>
<mobileno>12345678</mobileno>
<mobilestamp>13/05/2011 15:33:06.390+01:00</mobilestamp>
<mobileby>nn</mobileby>
</mobile>
</record>
</transfer>


FACT(s) (Environment):

All Supported Operating Systems
OpenEdge 10.x

CAUSE:

The EXPORT statement has no notion of the XML code page or the formatting of XML content. Export simply outputs data as a stream in a standard ABL output format.

FIX:

To resolve the issue use a more appropriate method of exporting the XML, for example with the x-document SAVE method.

DEFINE VARIABLE hDoc AS HANDLE NO-UNDO.
CREATE X-DOCUMENT hDoc.
hDoc:LOAD("Longchar",vSendXML,FALSE).
hDoc:SAVE("FILE","newXML.xml").