jueves, 2 de junio de 2011

Recorrer Xml en Navision

Como la propia funcionalidad de Navision no nos permite realizar lectura de ficheros Xml tendremos que crear variables "automation" que puedan tratar ficheros Xml.

Variables a Crear

locautXmlDoc Automation 'Microsoft XML, v6.0'.DOMDocument
XMLNodeList Automation 'Microsoft XML, v3.0'.IXMLDOMNodeList
XMLNode Automation 'Microsoft XML, v3.0'.IXMLDOMNode
XMLNodeBucle Automation 'Microsoft XML, v3.0'.IXMLDOMNode
vConta Integer
vConta2 Integer


Tambien es necesario crear dos funciones para tratar los ficheros. Una función es para recorrer los nodos del propio Xml (LoadNodeList) y otra que recorra todos los nodos pero de la lista que ya hemos leido(Load node)

Funcion LoadNodeList

XMLDocument : Automation "'Microsoft XML, v3.0'.IXMLDOMDocument2";VAR XMLNodeList : Automation "'Microsoft XML, v3.0'.IXML;VAR ElementName:Text

XMLNodeList := XMLDocument.getElementsByTagName(ElementName);

Funcion LoadNodelist

XMLNodeList : Automation "'Microsoft XML, v3.0'.IXMLDOMNodeList";VAR XMLNode : Automation "'Microsoft XML, v3.0'.IXMLDOMNode";VAR RecordIndex:Integer

XMLNode := XMLNodeList.item(RecordIndex);

Una vez creadas estas funciones que nos van a ayudar a reconocer los elementos del xml vamos con el cuerpo del código. Se ha hecho un aplicación que lea nodos hasta un máximo de dos niveles de jerarquía. Si existiesen más niveles unicamente sería necesario ir añadiendo código siguiendo el mismo criterio que el primero de los hijos.


Código

XMLDocument.load('C:\NewPolizaInstance.xml'); //se carga el fichero
LoadNodeList(XMLDocument,XMLNodeList,'newPolizaInstanceResponse');//se cargan los nodos a partir del descrito
TotNumbOfRecsA := XMLNodeList.length; //se sacan el numero de nodos
LoadNode(XMLNodeList,XMLNode,0); //se cargan los nodos de la lista que hemos sacado
IF TotNumbOfRecsA > 0 THEN REPEAT
//aquí empezamos a recorrer los hijos que cuelgan del metodo buscado
XMLNodeList2 :=XMLNode.childNodes;
LoadNode(XMLNodeList2,XMLNodeBucle,0);

//cargamos los nodos hijos
IF XMLNodeBucle.hasChildNodes THEN

FOR vConta:=0 TO XMLNodeList2.length DO BEGIN
//si cada nodo hijo tiene hijos se recorre
//comprobar que tiene hijos el nodo

XMLNodeList3:=XMLNodeBucle.childNodes;
//aquí el tercer nivel de jerarquia
LoadNode(XMLNodeList3,XMLNodeBucle2,0);

IF XMLNodeBucle2.hasChildNodes THEN


FOR vConta2:=0 TO XMLNodeList3.length DO BEGIN

IF UPPERCASE(XMLNodeBucle2.nodeName) = 'PR' THEN

//con esto se opera para un nodo en concreto, en este caso
XMLNodeComprobar :=XMLNodeBucle2.childNodes.item(0);
// se introduce la información en una tabla en caso de que
IF NOT ISCLEAR(XMLNodeComprobar) THEN
// el nodo se llame programa
rLecturaXml.text1:=XMLNodeComprobar.text;
END;
XMLNodeBucle := XMLNodeList2.nextNode;
END;
XMLNode := XMLNodeList.nextNode;
UNTIL ISCLEAR(XMLNode);