Buscar en este blog

martes, 7 de octubre de 2014

Leer XML en Ax 2012

Algunas veces en AX vamos a necesitar leer un XML, ya sea que provenga de una respuesta de un servicio WCF o web que estamos consumiendo o simplemente porque tenemos archivos externos que son necesarios leerlos para mostrar información a un usuario o bien porque necesitamos importar información de un xml hacia Ax.
En este caso, yo necesito leer un XML que es la respuesta de consumir un servicio, y tengo dos casos, uno cuando el XML es una respuesta correcta (en ese caso no se presenta nada al usuario) y la otra cuando viene especificado el error, en ese caso se requiere presentar al usuario el código de error y el mensaje de error.

Aquí los dos XML.
1. Cuando el proceso es correcto


2. Cuando el proceso es incorrecto
   <soap:Body>
      <actualizarCatalogosResponse xmlns=" http://sitioPrueba.com/ ">
         <actualizarCatalogosResult>
            <Resultado xmlns="">
               <Proceso>Incorrecto</Proceso>
               <Mensaje>El campo Tipo de Dimensión no es válido (Sólo admite valores: 1, 2, 3).</Mensaje>
               <Codigo>E001</Codigo>
            </Resultado>
         </actualizarCatalogosResult>
      </actualizarCatalogosResponse>
   </soap:Body>
</soap:Envelope>


Y el código en ax, para leer la cadena que me responde el servicio.
public static void showMessageXML( str _sourceXMLFile)
{
    str                 proceso, mensaje, codigoError;
    XmlDocument         xmlDocument;
    XmlNodeList         nodeList;
    XmlNode             node;
    XMLNodeListIterator xmlNodeListIterator;
    Counter             counter;

    xmlDocument = XmlDocument::newXml(_sourceXMLFile);
    nodeList = xmlDocument.selectNodes( '//Resultado'); // Nombre del nodo padre que quiero iterar

    xmlNodeListIterator = new xmlNodeListIterator(nodeList);
    while(xmlNodeListIterator.moreValues())   // Comenzando a iterar el nodo padre
    {
        counter++;
        node = xmlNodeListIterator.value();

        if(node.selectSingleNode('Proceso' ))    // Nombre del nodo que queremos leer 
            proceso = node.selectSingleNode( 'Proceso').text(); // Asignando valor del nodo
        if(node.selectSingleNode('Mensaje' ))
            mensaje = node.selectSingleNode( 'Mensaje').text();
        if(node.selectSingleNode('Codigo' ))
            codigoError = node.selectSingleNode( 'Codigo').text();

        // Si existe un mensaje de error, se presenta al usuario junto con el mensaje de error
        if (node.selectSingleNode('Mensaje' ) && node.selectSingleNode('Codigo')) 
        {
            Box::warning( strFmt("Error: %1 - %2" , codigoError, mensaje), "Interfaz Ax");
        }

        xmlNodeListIterator.nextValue();
    }
}

Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo.


No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 



1 comentario: