Как создавать/читать xml-файлы из NAV…

В своей предыдущей заметке я описал возможности по чтению xml-файлов из NAV. При этом сам файл – просто прикрепил, и не рассказал, как их создавать.

Исправляюсь.

——

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:mbs="http://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>

Создайте его с помощью кодеюнита:
—————————————-

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.
  }
}

—————————————
Он же может быть прочитан с помощью кодеюнита:

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.
  }
}

Оригинал заметки живет здесь: http://blogs.technet.com/b/gediminb/archive/2010/03/24/how-to-create-read-xml-file-from-nav.aspx

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Добавить комментарий