How to create/read xml file from Microsoft Dynamics NAV without using xmlports

How to create/read xml file from Microsoft Dynamics NAV without using xmlports

  • Comments 9

Periodically we receive support requests about XMLport errors, which really are missing features in xmlport's functionality.
However most of these requests are rejected because: xmlports are not supposed to fulfill all possible xml standard scenarios.
So there always will be xml file which can't be created or readed by NAV xmlport.
Possible workaround could be to use XML DOM automations.

Create it by codeunit:

----------------------------------------

 OBJECT Codeunit 50052 xml create
{
  OBJECT-PROPERTIES
  {
    Date=03/24/10;
    Time=[ 1:33:31 PM];
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            CREATE(xmlDoc);
            xmlMgt.SetNormalCase;
            xmlProcessingInst:=xmlDoc.createProcessingInstruction('xml','version="1.0" encoding="UTF-8" standalone="yes"');

            CurrNode := xmlDoc.appendChild(xmlProcessingInst);
            CurrNode := xmlDoc.createElement('soapenv:Envelope');
            CurrNode := xmlDoc.appendChild(CurrNode);


            xmlMgt.AddAttribute(CurrNode,'xmlns:soapenv','http://schemas.xmlsoap.org/soap/envelope/');
            xmlMgt.AddAttribute(CurrNode,'xmlns:mbs','http://www.microsoft.com/mbs/xml');

            xmlMgt.AddElement(CurrNode,'soapenv:Header','','soapenv',NewChild);
              CurrNode:=NewChild; //One level deeper
              xmlMgt.AddElement(CurrNode,'soapenv:Body','','soapenv',NewChild);
                   CurrNode:=NewChild; //one level deeper
                   xmlMgt.AddElement(CurrNode,'mbs:enumeration','','mbs',NewChild);
                        CurrNode:=NewChild; //one level deeper
                        xmlMgt.AddElement(CurrNode,'mbs:table','Customers','mbs',NewChild);

                     recCustomer.SETRANGE("No.", '10000','20000'); //Filter only few records
                     IF recCustomer.FINDFIRST THEN BEGIN
                       REPEAT
                        vName   :=recCustomer.Name;
                        vNo     :=recCustomer."No.";
                        vContact:=recCustomer.Contact;
                          recCustomer.CALCFIELDS("Balance (LCY)");
                          vBalance:= FORMAT(recCustomer."Balance (LCY)");
                        vSPcode :=recCustomer."Salesperson Code";


                        xmlMgt.AddElement(CurrNode,'mbs:Customer','','mbs',NewChild);
                              CurrNode1:=NewChild; //One level deeper, but keep current level too
                              xmlMgt.AddElement(CurrNode1,'mbs:CustomerAuthentication','','mbs',NewChild);
                                     CurrNode2:=NewChild; //One level deeper to sublevel
                                     xmlMgt.AddElement(CurrNode2,'mbs:No',vNo,'mbs',NewChild);
                                     xmlMgt.AddElement(CurrNode2,'mbs:Name',vName,'mbs',NewChild);

                              xmlMgt.AddElement(CurrNode1,'mbs:CustomerData','','mbs',NewChild);
                                     CurrNode2:=NewChild; //One level deeper to sublevel
                                     xmlMgt.AddElement(CurrNode2,'mbs:Balance',vBalance,'mbs',NewChild);
                                     xmlMgt.AddElement(CurrNode2,'mbs:SalespersonCode',vSPcode,'mbs',NewChild);
                                     xmlMgt.AddElement(CurrNode2,'mbs:Contacts','','mbs',NewChild);
                                         CurrNode1:=NewChild;//One level deeper
                                         xmlMgt.AddElement(CurrNode1,'mbs:Contact',vContact,'mbs',NewChild);


                        CLEAR(vName);
                        CLEAR(vNo)  ;
                        CLEAR(vContact);
                        CLEAR(vBalance);
                        CLEAR(vSPcode);

                       UNTIL recCustomer.NEXT=0;


                       xmlDoc.save('D:\xmlFile.xml');
                       CLEARALL;
                       MESSAGE('xmlFile.xml is created');
                     END;
          END;

  }
  CODE
  {
    VAR
      xmlDoc@1000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";
      CurrNode@1003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNode";
      CurrNode1@1005 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNode";
      CurrNode2@1013 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNode";
      NewChild@1004 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNode";
      xmlProcessingInst@1001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF89-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMProcessingInstruction";
      xmlMgt@1002 : Codeunit 6224;
      "---- Variables----"@1006 : Integer;
      recCustomer@1012 : Record 18;
      vName@1007 : Text[30];
      vNo@1008 : Text[30];
      vContact@1009 : Text[30];
      vBalance@1010 : Text[30];
      vSPcode@1011 : Text[30];

    EVENT xmlDoc@1000::ondataavailable@198();
    BEGIN
    END;

    EVENT xmlDoc@1000::onreadystatechange@-609();
    BEGIN
    END;

    BEGIN
    END.
  }
}

---------------------------------------

And can be read by codeunit: 

OBJECT Codeunit 50050 xml read
{
  OBJECT-PROPERTIES
  {
    Date=03/24/10;
    Time=12:25:26 PM;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            ffile.OPEN('D:\XmlFile.xml'); //this must be your file name
            ffile.CREATEINSTREAM(strInStream);

            IF ISCLEAR(xmldomDoc) THEN CREATE(xmldomDoc);

            xmldomDoc.load(strInStream);

            xmlNodeList1 := xmldomDoc.getElementsByTagName('mbs:Customer');

            ii:=xmlNodeList1.length();

            FOR i:=0 TO xmlNodeList1.length()-1 DO BEGIN
             xmldomElem1:= xmlNodeList1.item(i); //mbs:Customer
             IF xmldomElem1.hasChildNodes() THEN
                BEGIN
                  xmlNodeList2:= xmldomElem1.childNodes();
                  IF NOT ISCLEAR(xmlNodeList2) THEN
                  xmldomElem2:= xmlNodeList2.item(0); //mbs:CustomerAuthentication
                  IF NOT ISCLEAR(xmldomElem2) THEN
                  IF xmldomElem2.hasChildNodes() THEN
                     BEGIN
                     xmlNodeList3:= xmldomElem2.childNodes();
                     IF NOT ISCLEAR(xmlNodeList3) THEN
                      xmldomElem3:= xmldomElem2.firstChild();//mbs:No
                     IF NOT ISCLEAR(xmldomElem3) THEN
                      txtNo:=xmldomElem3.text();
                     xmldomElem3:=xmlNodeList3.item(1); //mbsName
                     IF NOT ISCLEAR(xmldomElem3) THEN
                      txtName:=xmldomElem3.text();

                  xmldomElem2:= xmlNodeList2.item(1); //mbs:CustomerData
                  IF NOT ISCLEAR(xmldomElem2) THEN
                  IF xmldomElem2.hasChildNodes() THEN
                     BEGIN
                     xmlNodeList3:= xmldomElem2.childNodes();
                     IF NOT ISCLEAR(xmlNodeList3) THEN
                      xmldomElem3:= xmldomElem2.firstChild();//mbs:Balance
                     IF NOT ISCLEAR(xmldomElem3) THEN
                      txtBalance:=xmldomElem3.text();
                     xmldomElem3:=xmlNodeList3.item(1); //mbsSalesPersonCode
                     IF NOT ISCLEAR(xmldomElem3) THEN
                      txtSPcode:=xmldomElem3.text();
                     END;

                     xmldomElem3:=xmlNodeList3.item(2); //mbs:Contacts
                     IF NOT ISCLEAR(xmldomElem3) THEN
                        txtContact:=xmldomElem3.text();

                 END;
            END;
                  MESSAGE('This is record "%1"\No "%2"\Name "%3"\Contact "%4"\Balance "%5"\Salesperson code "%6"\of Total "%7"',
                  FORMAT(i+1),
                  txtNo,
                  txtName,
                  txtContact,
                  txtBalance,
                  txtSPcode,
                  ii);

            END;
            ffile.CLOSE;
            CLEARALL;
          END;

  }
  CODE
  {
    VAR
      xmldomDoc@1000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";
      xmlNodeList1@1005 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF82-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNodeList";
      xmlNodeList2@1017 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF82-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNodeList";
      xmlNodeList3@1019 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF82-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMNodeList";
      xmldomElem1@1007 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
      xmldomElem2@1010 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
      xmldomElem3@1011 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v6.0'.IXMLDOMElement";
      txtNo@1001 : Text[30];
      txtName@1002 : Text[30];
      txtContact@1009 : Text[30];
      txtBalance@1012 : Text[30];
      txtSPcode@1013 : Text[30];
      ffile@1003 : File;
      strInStream@1004 : InStream;
      i@1006 : Integer;
      ii@1018 : Integer;

    EVENT xmldomDoc@1000::ondataavailable@198();
    BEGIN
    END;

    EVENT xmldomDoc@1000::onreadystatechange@-609();
    BEGIN
    END;

    BEGIN
    END.
  }
}

That's all
Special thanks to
Rainer Kuhnlein

Gedas Busniauskas (gediminb)
Microsoft Customer Service and Support (CSS) EMEA

 

Attachment: xmlFile.xml
Leave a Comment
  • Please add 7 and 6 and type the answer here:
  • Post
  • There is a lot more to XML document generation and processing, including validations, transactions, transformations and more. Several commercial tools offer a comprehensive set of features, such as our Connectivity Studio for Dynamics NAV.

  • Remember that 'XML DOM Management' is available in Advanced management licence.

    With bussiness essential licence cutomer does not have permission to run this code unit.

  • <?xml version=”1.0” ?>

    <NICKSMS version=1.0>

    <request userid="yourUserId" password="yourPassword" pin="yourPin"

    type="push">

          <publishData>

            <fromAddress></fromAddress>

            <messageTxt>Your message here</messageTxt>

            <addressArray>

                  <address>Your Mobil no here</address>

            </addressArray>

          </publishData>

          <scheduleTime></scheduleTime>

    </request>

    </NICKSMS>

    **** This is xml format which will be used to send sms. I want to know how to create that in navision ?

  • to navuser1.

    hard to say how your xml really formatted but as understand codeunit code can be:

    ------------------

    CREATE(xmlDoc);

    xmlMgt.SetNormalCase;

    xmlProcessingInst:=xmlDoc.createProcessingInstruction('xml','version="1.0"');

    CurrNode := xmlDoc.appendChild(xmlProcessingInst);

    CurrNode := xmlDoc.createElement('NICKSMS');

    CurrNode := xmlDoc.appendChild(CurrNode);

    xmlMgt.AddAttribute(CurrNode,'version','1.0');

    xmlMgt.AddElement(CurrNode,'request','','',NewChild);

    xmlMgt.AddAttribute(NewChild,'userID','YourUserID');

    xmlMgt.AddAttribute(NewChild,'password','YourPassword');

    xmlMgt.AddAttribute(NewChild,'pin','YourPin');

    xmlMgt.AddAttribute(NewChild,'Type','push');

    CurrNode:=NewChild; //one level deeper

    xmlMgt.AddElement(CurrNode,'publishData','','',NewChild);

    xmlMgt.AddElement(CurrNode,'FromAddress','','',NewChild);

    xmlMgt.AddElement(CurrNode,'Message','Your Message Here','',NewChild);

    xmlMgt.AddElement(CurrNode,'AddressArray','','',NewChild);

     CurrNode1:=NewChild; //One level deeper

     xmlMgt.AddElement(CurrNode1,'address','Your Mobil no here','',NewChild);

    xmlMgt.AddElement(CurrNode,'ScheduleTime','','',NewChild);

    ----------------------------------

    BR

    Gedas

  • thank.

    I have created that one thru a codeunit (id 50000) know i want to send it. how to send it ?

  • Where do you want to send codeunit?

  • I have created the xml document thru a Codeunit. The xml format will be used to send sms.

  • I have created the xml now I'm trying to send this to the web service.

    How to send it ?

  • It's done.

    Thanks for your support.

Page 1 of 1 (9 items)