Как прочесть xml-документ из Navision при помощи Microsoft XMLDOM automation
Мне часто задают вопросы типа «Как в Navision читать xml-документы без использования xml-портов?» В основном они связаны с тем, что xml-порты имеют ограничения и не всегда их можно использовать.
Вот пример кодеюнита, который считывает xml-узлы из файлы. Просто пример, ничего более… :-)
{
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.
}
}
На вопросы типа «Как создавать Xml-файлы из NAV» ответить легче, потому что можно использовать xml-порты, датапорты, прямая запись в файл или тот же xmlDom-automation.
Оригинал заметки живет здесь:

Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.
Вот в этом месте похоже на опечатку:
…
FOR i:=1 TO xmlNodeList1.length()-1
…
у NodeList нумерация элементов идет с нуля.