2

I am developing in OpenEdge 11.1 and can successfully create an XML document from static data and connect to a third party API via SOAP.

I want to add an existing XML object to the new document I am creating, according to the Progress Help I should be able to add a Node of Type "DOCUMENT-FRAGMENT". When I do this my parent Node is just empty, and I do not get any error messages.

Is there some specific way of assigning the object to the new Node? I am trying with some static data (a string of valid XML) and have even thought of encoding the string in case it cannot handle the format.

Has anyone achieved this before now, what am I doing wrong?

DEFINE VARIABLE hDoc        AS HANDLE      NO-UNDO.
DEFINE VARIABLE hRoot       AS HANDLE      NO-UNDO.
DEFINE VARIABLE hNode       AS HANDLE      NO-UNDO.
DEFINE VARIABLE hRow        AS HANDLE      NO-UNDO.

DEFINE VARIABLE clData      AS LONGCHAR   NO-UNDO.

CREATE X-DOCUMENT   hDoc.
CREATE X-NODEREF    hRoot.
CREATE X-NODEREF    hNode.
CREATE X-NODEREF    hRow.

hDoc:CREATE-NODE(hRoot,"NewDocument","ELEMENT").
hDoc:APPEND-CHILD(hRoot).
hRoot:SET-ATTRIBUTE("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance").


/* NewDocument Product data */
hDoc:CREATE-NODE(hNode,"Product","ELEMENT").
hRoot:APPEND-CHILD(hNode).
/* Product Detail */
hDoc:CREATE-NODE(hRow,"","DOCUMENT-FRAGMENT").
hNode:APPEND-CHILD(hRow).
hRow:NODE-VALUE = '<Available>10</Available><ProductCode>ABC</ProductCode>~
<ProductName>Special</ProductName><ValidFrom>2014-05-02T08:15:00</ValidFrom>~
<ValidTo>2014-05-02T12:45:00</ValidTo><Comments xsi:nil="true" />~
<Price>9.00</Price><PriceID>123456789</PriceID>'.

hDoc:SAVE("LONGCHAR", clData).
DELETE OBJECT hDoc.
DELETE OBJECT hRoot.
DELETE OBJECT hRow.
DELETE OBJECT hNode.

OUTPUT TO "test.log" APPEND.
PUT UNFORMATTED "Start request... " SKIP.
OUTPUT CLOSE.
COPY-LOB clData TO FILE "test.log" APPEND.

1 Answers1

0

document-fragment looks interesting - but seems useless.

In the work-around corner you could import the product detail into a new x-document and then use import-node to copy the data to the target document.

DEFINE VARIABLE hDoc    AS HANDLE   NO-UNDO.
DEFINE VARIABLE hRoot   AS HANDLE   NO-UNDO.
DEFINE VARIABLE hNode   AS HANDLE   NO-UNDO.
DEFINE VARIABLE hRow    AS HANDLE   NO-UNDO.
DEFINE VARIABLE lcc     AS LONGCHAR NO-UNDO.

CREATE X-DOCUMENT hDoc.
CREATE X-NODEREF  hRoot.

hDoc:CREATE-NODE( hRoot, "Root", "ELEMENT" ).
hDoc:APPEND-CHILD( hRoot ).

/* NewDocument Product data */
CREATE X-NODEREF hNode.
hDoc:CREATE-NODE( hNode, "Product", "ELEMENT" ).

DEFINE VARIABLE hdocfrag AS HANDLE NO-UNDO.

/* Product Detail */
lcc = '<Available>10</Available><ProductCode>ABC</ProductCode><ProductName>Special</ProductName><ValidFrom>2014-05-02T08:15:00</ValidFrom><ValidTo>2014-05-02T12:45:00</ValidTo><Comments xsi:nil="true" /><Price>9.00</Price><PriceID>123456789</PriceID>'. 
lcc = SUBSTITUTE( '<Product>&1</Product>', lcc ).

CREATE X-DOCUMENT hdocfrag.
hdocfrag:LOAD( "longchar", lcc, FALSE ) NO-ERROR. /* no-error to suppress xsi 'warning' */

CREATE X-NODEREF hrow.
hdocfrag:GET-DOCUMENT-ELEMENT( hrow ).

hdoc:IMPORT-NODE( hnode, hrow, TRUE ).

DELETE OBJECT hrow.
DELETE OBJECT hdocfrag.

hRoot:APPEND-CHILD( hNode ).


hDoc:SAVE( "LONGCHAR", lcc ).

DELETE OBJECT hDoc.
DELETE OBJECT hRoot.
DELETE OBJECT hNode.

COPY-LOB lcc TO FILE "test.log".
Stefan Drissen
  • 3,266
  • 1
  • 13
  • 21