miércoles, junio 27, 2012

XML en CDATA


Es común encontrarse con interfaces que se comunican mediante mensajes XML en un campo de texto. Esto suele complicar la definición del escenario, requiriendo de mapeos externos mediante JAVA o XSLT.

A continuación muestro una propuesta, que considero sencilla desde mi punto de vista, para abordar este tipo de escenarios.

Partimos del siguiente mensaje de petición:

SOAPaction: http://ejemplo.es/ws/accionSOAPx

<?xml version="1.0" encoding="UTF-8"?>
<ns1:ObtenerDatos
      xmlns:ns1="http://ejemplo.es/appnetws">
<ns1:sToken>
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<TOKEN>
<AppName>APPNAME</AppName>
<AppToken>APPTOKEN</AppToken>
</TOKEN>
]]>
</ns1:sToken>
</ns1:ObtenerDatos>


Y la respuesta tiene el siguiente formato para los aciertos:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:ObtenerDatosResponse xmlns:ns0="http://ejemplo.es/appnetws">
<ns0:ObtenerDatosResult>
<![CDATA[
<?xml version=“1.0” encoding=“utf-8”?>
<MOVIMIENTOS/>
]]>
</ns0:ObtenerDatosResult>
</ns0:ObtenerDatosResponse>

Y el siguiente formato para los fallos:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:ObtenerDatosResponse xmlns:ns0="http://ejemplo.es/appnetws">
<ns0:ObtenerDatosResult>
<![CDATA[
<?xml version=“1.0” encoding=“utf-8”?>
<ERROR>
<Message>Token incorrecto</Message>
<StackTrace/>
</ERROR>
]]>
</ns0:ObtenerDatosResult>
</ns0:ObtenerDatosResponse>


Tipos de datos

Petición: TOKEN




Respuesta: MT_Respuesta

Como en el campo de respuesta pueden venir dos tipos de mensajes (éxito o error), he creado un tipo de mensaje como combinación de ambas estructuras.




IMPORTANTE: los espacios de nombre XML de los tipos de mensaje los he dejado en blanco adrede para que coincidan con lo que vendrá en el contenido en CDATA.



Mapeos

Mapeo Envío

Para meter el contenido de un mensaje como texto bastará usar la función concatenar con la cabecera del mensaje pasado como XML y una constante vacía:




Mapeo Respuesta

En este caso, es necesario hacer uso de un mapeo XSLT. Como en el campo donde viene el contenido también aparece la cabecera XML, puede ser necesario obviarla para evitar problemas malformación del mensaje.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0=”http://ejemplo.es/appnetws
    xmlns:ns1=”http://local.es/xi/app/datos”
    version="1.0">  
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
      <xsl:template match="/">
            <MT_Response>
                  <xsl:value-of select="substring-after(ns0:ObtenerDatosResponse/ns0:ObtenerDatosResult,'?>')"  disable-output-escaping="yes"/>
            </MT_Response>
      </xsl:template> 
</xsl:stylesheet>  

Aspectos a considerar en este mapeo:
·         encoding: es necesario que sea coherente con la codificación que vaya a venir en el XML del CDATA.
·         omit-xml-declaration: se debe poner a “yes” si se va a dejar la mensaje tal cual. En este caso, al añadir una capa por encima del mensaje (MT_Response), se va a omitir la del mensaje que viene en el CDATA.
·         substring-after(string,value): para omitir la declaración XML del mensaje, nos quedamos con el texto después del patrón “?>”.

Es importante tener en cuenta qué etiquetas están asociadas a espacios de nombre. En este caso, conviven 2 (ns0 y ns1) y ser coherente con ello.

SOAP Action

Por último, para indicar la acción SOAP necesaria, es necesario especificarlo en el adaptador SOAP receptor correspondiente en el apartado de conversión de parámetros


1 comentario:

Suseela dijo...





That is very interesting; you are a very skilled blogger. I have shared your website in my social networks..!


Online Reputation Management