Hello friends,
First time poster on forum.
Trying to create a "POST" webservice call and would like some advice on best method to call xmlcdata function in creation of body of XML document.
But I am stuck in inserting Cdata section
Snapshot of the layout of the file i am trying to create is
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:onl = "http://api.url.com"
<soapenv: Header />
<soapenv: Body>
<CalculateRate>
<id>userid</id>
<password>password</password>
<consignment><![CDATA[
<connote>
<recaccno>123456</recaccno>
<carriername>Test Carrier</carriername>
<service>PARCEL</service>
<recaddr>
<add1>Address 1</add1>
<City>City</City>
<State>State</State>
</recaddr>
<sendername>Test Sender</sendername>
<sendadd>
<add1>Sender Address 1<add1>
<City>Sender City</City>
</sendadd>
</connote>]]></consignment>
</CalculateRate>
</soapenv: Body>
</soapenv:Header>
<soapenv:Envelope>
Struggling to see how to add the nodes into the CDATA section.
I have tried to follow "Creating Soap Request Message in AL" (DiveshBora).
Below is the code that has been written
var
XMLDomMgt: Codeunit "XML DOM Mgt.";
SoapNS11: Label 'schemas.xmlsoap.org/.../', Locked = true;
XsiNS: Label 'www.smartfreight.com/online', Locked = true;
Parameters: XmlDocument;
EnvelopeNode: XmlNode;
HeaderNode: XmlNode;
BodyNode: XMLNode;
lXMLText: Text;
Result: XmlDocument;
StrxmlNodeValue: text;
CdataNode: XmlNode;
XMLcd: XmlCData;
CarrierSetup: Record "848_Carrier Setup";
Resulttxt: text;
CalcRateNode: XMLNode;
ConsignNode: XMLNode;
ConnoteNode: XMLNode;
ConnoteNode2: XMLNode;
lTempXmlNode: XmlNode;
recaddrNode: XMLNode;
SendaddrNode: XmlNode;
freightNode: XmlNode;
procedure SendShippingDetails(var SalesHeader: record "Sales Header")
begin
If not CarrierSetup.Get() then
Error('Carrier Setup is needed, please enter User id and URL');
Parameters := XmlDocument.Create();
CreateEnvelopeNode(Parameters, EnvelopeNode); //Envelope Node
CreateHeaderNode(EnvelopeNode, HeaderNode); //Header Node
CreateBodyNode(EnvelopeNode, BodyNode); //Body Node
CreateCalcRateNode(BodyNode, CalcRateNode); //Calculate Rate Node
//Adding the Elements to calculate Rate Node
AddElement(CalcRateNode, 'id', CarrierSetup."User ID", SoapNS11, lTempXmlNode);
AddElement(CalcRateNode, 'password', CarrierSetup.Password, SoapNS11, lTempXmlNode);
CreateConsignNode1(CalcRateNode, ConsignNode); //Calculate Rate Node
CreateConnoteNode2(ConsignNode, ConnoteNode2);
AddElement(ConnoteNode2, 'carriername', 'Test Carrier1', SoapNS11, lTempXmlNode);
AddElement(ConnoteNode2, 'service', 'PARCEL', SoapNS11, lTempXmlNode);
AddElement(ConnoteNode2, 'accno', '123456', SoapNS11, lTempXmlNode);
AddElement(ConnoteNode2, 'recaccno', 'TEST', SoapNS11, lTempXmlNode);
AddElement(ConnoteNode2, 'recname', 'TEST RECEIVER', SoapNS11, lTempXmlNode);
CreateRecaddrNode(ConnoteNode2, recaddrNode);
AddElement(recaddrNode, 'add1', 'Test Carrier1', SoapNS11, lTempXmlNode);
AddElement(recaddrNode, 'add2', 'PARCEL', SoapNS11, lTempXmlNode);
AddElement(recaddrNode, 'add3', '123456', SoapNS11, lTempXmlNode);
AddElement(recaddrNode, 'add4', 'TEST', SoapNS11, lTempXmlNode);
AddElement(recaddrNode, 'add5', 'TEST RECEIVER', SoapNS11, lTempXmlNode);
CreateSendaddrNode(ConnoteNode2, sendaddrNode);
AddElement(sendaddrNode, 'sadd1', 'Test Carrier1', SoapNS11, lTempXmlNode);
AddElement(sendaddrNode, 'sadd2', 'PARCEL', SoapNS11, lTempXmlNode);
AddElement(sendaddrNode, 'sadd3', '123456', SoapNS11, lTempXmlNode);
AddElement(sendaddrNode, 'sadd4', 'TEST', SoapNS11, lTempXmlNode);
AddElement(sendaddrNode, 'sadd5', 'TEST RECEIVER', SoapNS11, lTempXmlNode);
CreatefreightNode(ConnoteNode2, freightNode);
AddElement(freightNode, 'ref', SalesHeader."No.", SoapNS11, lTempXmlNode);
AddElement(freightNode, 'amt', '1', SoapNS11, lTempXmlNode);
AddElement(freightNode, 'youritemdesc', 'itemno', SoapNS11, lTempXmlNode);
AddElement(freightNode, 'desc', 'CARTON', SoapNS11, lTempXmlNode);
AddElement(freightNode, 'wgt', '1', SoapNS11, lTempXmlNode);
AddElement(freightNode, 'cube', '0.1', SoapNS11, lTempXmlNode);
Result := CallWebService('CalculateRate', Parameters);
Result.WriteTo(Resulttxt);
message(Resulttxt);
end;
procedure CreateEnvelopeNode(var pXMLDoc: XmlDocument; var pEnvXMLNode: XmlNode)
begin
pXmlDoc := XmlDocument.Create;
XMLDomMgt.AddDeclaration(pXmlDoc, '1.0', 'UTF-8', 'yes');
XMLDomMgt.AddRootElementWithPrefix(pXmlDoc, 'Envelope', 'Soapenv', SoapNS11, pEnvXmlNode);
XMLDommgt.AddPrefix(pEnvXmlNode, 'onl', XsiNS);
end;
procedure CreateHeaderNode(var pXMLEnvNode: XmlNode; Var pXMLHeaderNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'Header', '', SoapNS11, pXmlHeaderNode);
end;
procedure CreateBodyNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'Body', '', SoapNS11, pXmlBodyNode);
end;
procedure CreateCalcRateNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'CalculateRate', '', SoapNS11, pXmlBodyNode);
end;
procedure CreateConsignNode1(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'consignmentxml', '', SoapNS11, pXmlBodyNode);
end;
procedure CreateRecaddrNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'recaddr', '', SoapNS11, pXmlBodyNode);
end;
procedure CreateSendaddrNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'sendaddr', '', SoapNS11, pXmlBodyNode);
end;
procedure CreatefreightNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'freightlinedetails', '', SoapNS11, pXmlBodyNode);
end;
procedure CreateConsignNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode; SH: Record "Sales Header");
begin
Clear(StrxmlNodeValue);
AddElement(pXMLEnvNode, 'consignmentxml', '', SoapNS11, pXmlBodyNode);
StrxmlNodeValue := '';
XMLcd := XmlCData.Create(StrxmlNodeValue);
ConsignNode.AddAfterSelf(XMLcd);
CdataNode := XMLElement.Create('connote', '').AsXmlNode();
CreateConnoteNode(CdataNode, ConnoteNode);
//createConnoteNode2(ConnoteNode, ConnoteNode2);
AddElement(ConnoteNode2, 'carriername', 'Test Carrier1', SoapNS11, lTempXmlNode);
AddElement(CalcRateNode, 'service', 'PARCEL', SoapNS11, lTempXmlNode);
AddElement(CalcRateNode, 'accno', '123456', SoapNS11, lTempXmlNode);
AddElement(CalcRateNode, 'recaccno', 'TEST', SoapNS11, lTempXmlNode);
AddElement(CalcRateNode, 'recname', 'TEST RECEIVER', SoapNS11, lTempXmlNode);
end;
procedure CreateConnoteNode(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'Connote', '', SoapNS11, pXmlBodyNode);
end;
procedure CreateConnoteNode2(var pXMLEnvNode: XmlNode; Var pXMLBodyNode: XmlNode);
begin
AddElement(pXMLEnvNode, 'Connote', '', SoapNS11, pXmlBodyNode);
end;
procedure AddElement(var pXMLNode: XmlNode; pNodeName: Text; pNodeText: Text; pNameSpace: Text; var pCreatedNode: XmlNode): Boolean
var
lNewChildNode: XmlNode;
begin
if pNodeText <> '' then
lNewChildNode := XmlElement.Create(pNodeName, pNameSpace, pNodeText).AsXmlNode()
else
lNewChildNode := XmlElement.Create(pNodeName, pNameSpace).AsXmlNode();
if pXMLNode.AsXmlElement().Add(lNewChildNode) then begin
pCreatedNode := lNewChildNode;
exit(true);
end;
end;
This is all running of an action on the Sales Order page.
Appreciate any assistance and thanking you in advance
Regards
Gurnek