Udostępnij za pośrednictwem


How to read from NAV xml document using Microsoft XMLDOM automation

Usually i meet questions about "How to read from NAV xml documents without xmlports?"
It is because xml ports have some limitations and sometimes don't allow us to use it.
There is sample codeunit which reads xml nodes from file. It is just example and no more....:)

OBJECT Codeunit 50050 xml read
{
  OBJECT-PROPERTIES
  {
    Date=05.08.12;
    Time=15:13:32;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            ffile.OPEN('C:\XmlFile.xml'); //this must be your file name
            ffile.CREATEINSTREAM(strInStream);

            IF ISCLEAR(xmldomDoc) THEN CREATE(xmldomDoc);

            xmldomDoc.load(strInStream);

            xmlNodeList1:= xmldomDoc.childNodes();

            FOR i:=1 TO xmlNodeList1.length()-1 DO BEGIN
             xmldomElem1:= xmlNodeList1.item(i);
                IF NOT ISCLEAR(xmldomElem1) THEN
                   xmldomAttrib:= xmldomElem1.getAttributeNode('ID');
                   IF NOT ISCLEAR(xmldomAttrib) THEN
                      txtid:=xmldomAttrib.value();
                   xmldomAttrib:= xmldomElem1.getAttributeNode('Type');
                   IF NOT ISCLEAR(xmldomAttrib) THEN
                      txttype:=xmldomAttrib.value();
                   xmldomAttrib:= xmldomElem1.getAttributeNode('Version');
                   IF NOT ISCLEAR(xmldomAttrib) THEN
                      txtVer:=xmldomAttrib.value();

                  //>>Find Node next level
                     xmldomElem2:=xmldomElem1.firstChild();
                     xmldomElem3:=xmldomElem2.firstChild();
                     xmldomAttrib:= xmldomElem3.getAttributeNode('Author');
                      IF NOT ISCLEAR(xmldomAttrib) THEN
                         txtAut:=xmldomAttrib.value();
                     xmldomAttrib:= xmldomElem3.getAttributeNode('TimeStamp');
                      IF NOT ISCLEAR(xmldomAttrib) THEN
                         txtTS:=xmldomAttrib.value();

                  //Next node

                  xmlNodeList2:= xmldomElem1.childNodes();
                  FOR ii:=0 TO xmlNodeList2.length()-2 DO BEGIN
                     xmldomElem2:= xmlNodeList2.item(ii);
                     xmldomElem3:= xmldomElem2.firstChild();

                   xmldomAttrib:= xmldomElem3.getAttributeNode('CustomerID');
                   IF NOT ISCLEAR(xmldomAttrib) THEN
                      txtCI:=xmldomAttrib.value();
                   xmldomAttrib:= xmldomElem3.getAttributeNode('ID');
                   IF NOT ISCLEAR(xmldomAttrib) THEN
                      txtCID:=xmldomAttrib.value();

                   //go deeper
                   xmldomElem3:= xmldomElem3.firstChild();

                   IF NOT ISCLEAR(xmldomElem3) THEN
                   xmldomAttrib:= xmldomElem3.getAttributeNode('OrganizationName');
                   IF NOT ISCLEAR(xmldomAttrib) THEN
                      txtON:=xmldomAttrib.value();

 

                  END;
                  MESSAGE('ID "%1"\Type "%2"\Version "%3"\Author "%4"\timestamp "%5"\Customer ID "%6"\Contact ID "%7"\Org Name "%8"',
                  txtid,
                  txttype,
                  txtVer,
                  txtAut,
                  txtTS,
                  txtCI,
                  txtCID,
                  txtON);

            END;
            ffile.CLOSE;
            CLEARALL;
          END;

  }
  CODE
  {
    VAR
      xmldomDoc@1000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{88D969E5-F192-11D4-A65F-0040963251E5}:'Microsoft XML, v5.0'.DOMDocument50";
      xmlNodeList1@1005 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{2933BF82-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v5.0'.IXMLDOMNodeList";
      xmlNodeList2@1017 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{2933BF82-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v5.0'.IXMLDOMNodeList";
      xmldomElem1@1007 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v5.0'.IXMLDOMElement";
      xmldomElem2@1010 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v5.0'.IXMLDOMElement";
      xmldomElem3@1011 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{2933BF86-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v5.0'.IXMLDOMElement";
      xmldomAttrib@1008 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 5.0:{2933BF85-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v5.0'.IXMLDOMAttribute";
      txtid@1001 : Text[30];
      txttype@1002 : Text[30];
      txtVer@1009 : Text[30];
      txtAut@1012 : Text[30];
      txtTS@1013 : Text[30];
      txtCI@1014 : Text[30];
      txtCID@1015 : Text[30];
      txtON@1016 : 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.
  }
}

 

Questions like "How to create xml files from NAV" are more easier, because you can use xmlport, dataport, write directly to file or use the same xmlDom automation.