Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
In the BLOG post https://blogs.technet.com/gediminb/archive/2008/02/12/how-to-read-from-nav-xml-document-using-microsoft-xmldom-automation.aspx I discribed possibilities to read xml file form NAV. However i did attached xml file and didn't described how to create xml file.
So now I'm fixing this.
xml file:
----
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soapenv:Envelope xmlns:soapenv="https://schemas.xmlsoap.org/soap/envelope/" xmlns:mbs="https://www.microsoft.com/mbs/xml">
<soapenv:Header xmlns:soapenv="soapenv">
<soapenv:Body>
<mbs:enumeration xmlns:mbs="mbs">
<mbs:table>Customers</mbs:table>
<mbs:Customer>
<mbs:CustomerAuthentication>
<mbs:No>10000</mbs:No>
<mbs:Name>The Cannon Group PLC</mbs:Name>
</mbs:CustomerAuthentication>
<mbs:CustomerData>
<mbs:Balance>168,364.41</mbs:Balance>
<mbs:SalespersonCode>PS</mbs:SalespersonCode>
<mbs:Contacts>
<mbs:Contact>Mr. Andy Teal</mbs:Contact>
</mbs:Contacts>
</mbs:CustomerData>
</mbs:Customer>
<mbs:Customer>
<mbs:CustomerAuthentication>
<mbs:No>20000</mbs:No>
<mbs:Name>Selangorian Ltd.</mbs:Name>
</mbs:CustomerAuthentication>
<mbs:CustomerData>
<mbs:Balance>96,049.99</mbs:Balance>
<mbs:SalespersonCode>PS</mbs:SalespersonCode>
<mbs:Contacts>
<mbs:Contact>Mr. Mark McArthur</mbs:Contact>
</mbs:Contacts>
</mbs:CustomerData>
</mbs:Customer>
</mbs:enumeration>
</soapenv:Body>
</soapenv:Header>
</soapenv:Envelope>
-----
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','https://schemas.xmlsoap.org/soap/envelope/');
xmlMgt.AddAttribute(CurrNode,'xmlns:mbs','https://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.
}
}
Comments
- Anonymous
August 10, 2015
GOOD