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:
<?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:
<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:
<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.
1 comentario:
That is very interesting; you are a very skilled blogger. I have shared your website in my social networks..!
Online Reputation Management
Publicar un comentario