2009-05-21 9 views
5

Desarrollé un servicio web y lo implementé con Axis. Todo funciona muy bien, pero tengo un problema cuando consumo el servicio usando una cadena que contiene un carácter no imprimible (como ETX, FS, ..). tengo el siguiente error:caracteres XML ilegales/Axis

exception: java.lang.IllegalArgumentException: The char '0x1c' after '....' is not a valid XML character. 

tiene alguna idea por favor?

edición:

tengo que enviar una trama a mi servidor utilizando el servicio web. Mi cuerpo tiene una forma estricta (que contiene algunos caracteres no imprimibles como separador)

class Automate {void checkFrame(String frame){// checking the frame}} 

archivo WSDL

<?xml version="1.0" encoding="UTF-8"?> 

<wsdl:part element="impl:checkFrameResponse" name="parameters"/> 

<wsdl:part element="impl:checkFrame" name="parameters"/> 

<wsdl:operation name="checkFrame"> 

    <wsdl:input message="impl:checkFrameRequest" name="checkFrameRequest"/> 

    <wsdl:output message="impl:checkFrameResponse" name="checkFrameResponse"/> 

    </wsdl:operation> 

<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 

    <wsdl:operation name="checkFrame"> 

    <wsdlsoap:operation soapAction=""/> 

    <wsdl:input name="checkFrameRequest"> 

     <wsdlsoap:body use="literal"/> 

    </wsdl:input> 

    <wsdl:output name="checkFrameResponse"> 

     <wsdlsoap:body use="literal"/> 

    </wsdl:output> 

    </wsdl:operation> 

<wsdl:port binding="impl:AutomateSoapBinding" name="Automate"> 

    <wsdlsoap:address location="http://localhost:8080/Gateway/services/Automate"/> 

    </wsdl:port> 

Respuesta

3

Este es un problema natural con SOAP, por desgracia - que utiliza XML fo r texto, y esos caracteres no se pueden representar en XML (incluso con entidades).

¿Se puede escapar de algún modo de los caracteres no imprimibles? Necesitarás encontrar la manera de no representarlos como texto directo, desafortunadamente.

+0

No puedo escapar de esos caracteres, los necesito para un procesamiento posterior. entonces, ¿cómo puedo proceder? –

+0

Vas a * tener * para escapar de alguna manera. Pero si los escapa en el lado de la llamada, puede desactivarlos en el lado de recepción y, por lo tanto, seguir utilizando los datos. No estaba sugiriendo * eliminar * los personajes "malos". –

+0

Para ser más claro. Estoy desarrollando una puerta de enlace que recibirá un marco de una terminal que tiene una forma estricta, así que no puedo tocarlo. ¡Mi servicio web debe poder recibirlo así como también reenviarlo al servidor! ¡Ahora estoy creando un servicio web de cliente solo para pruebas en el host local! –

0

Parece que tiene texto que no se puede representar en XML. Tendrás que escapar de estos personajes, pero para ser honesto, sospecho que deberías "escapar" toda la cadena. La codificación de base64 de la cadena podría funcionar, pero también podría examinar MTOM o algún otro mecanismo para pasar datos binarios a través de servicios web.

Si posee ambos lados de este sistema (los clientes y el servicio web), entonces no debería ser demasiado difícil agregar los pasos de codificación/descodificación y la codificación de base64 debería ser suficiente.

+0

lamentablemente no !! ¡Estoy desarrollando el servicio web! ¡Y normalmente recibiría una cadena de la terminal! –

+0

Por lo tanto, está definiendo el contrato y la semántica de mensajes si es el propietario del servicio. Esto le permite decir "enviarme XML válido" o decir "codificar su texto", ¿no es así? –

+0

La única situación en la que ese no sería el caso es cuando está implementando un contrato de servicio bien conocido y el cliente no puede ser alterado. –

1

Al formar el XML que va a meter dentro del sobre XML de SOAP, necesita asegurarse de que no tiene ningún carácter sin escindir en los valores de sus atributos y en los nodos de texto que tenga en sus elementos. Es decir:

<your_elt your_attr="Don&apos;t put unescaped chars here, eg, apostrophe"> 
    <foo> 
     Be sure to escape stuff here too, like: 2 &lt; 100 
     A greek lambda is escaped like this: &#955; 
    </foo> 
</your_elt> 

Asumo que estás haciendo esto en Java, por lo que debe buscar en bibliotecas que hacen esto de forma automática. Apache tiene StringEscapeUtils, por ejemplo.

Sus caracteres de control deberían ser escapados por XML numeric character references. Esperemos que StringEscapeUtils maneje eso por ti.

Espero que esto ayude.

+0

¡¡Creo que esto es lo que estoy buscando !!! Lo intentaré! Gracias :)) –

1

use CDATA para datos que no forman parte de la estructura xml (es decir, contenido), si entiendo correctamente y solo está enrutando mensajes, esto es lo que debe hacer.

Cuestiones relacionadas