2009-05-21 23 views
5

Ho sviluppato un servizio Web e l'ho implementato con Axis. Tutto sta funzionando molto bene ma ho un problema quando consumo il servizio usando una stringa che contiene un carattere non stampabile (come ETX, FS, ..). Ho il seguente errore:caratteri XML non validi/Asse

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

avete qualche idea per favore?

edit:

devo inviare un frame al mio server utilizzando il servizio web. Mio telaio ha una forma rigida (contenente alcuni carattere non stampabile come separatore)

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

file 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> 

risposta

3

Questo è un problema naturale con SOAP, purtroppo - si usa XML fo r testo, e quei caratteri non possono essere rappresentati in XML (anche con entità).

Puoi sfuggire in qualche modo ai caratteri non stampabili? Dovrai trovare il modo di non rappresentarli come testo normale, sfortunatamente.

+0

Non riesco a sfuggire a quei personaggi che mi servono per un'ulteriore elaborazione. quindi come posso procedere? –

+0

Hai intenzione * di * di sfuggirli in qualche modo. Ma se li scappi dal lato della chiamata, puoi riprenderli dal lato ricevente e utilizzare ancora i dati. Non stavo suggerendo * lasciando cadere * i caratteri "cattivi". –

+0

Per essere più chiari. Sto sviluppando un gateway che riceverà un frame da un terminale che ha una forma rigorosa, quindi non posso toccarlo. Il mio servizio web deve essere in grado di riceverlo così come è di inoltrarlo di nuovo al server !! Sto creando un servizio Web client solo per i test nell'host locale !! –

0

Sembra che tu abbia un testo che non può essere rappresentato in XML. Dovrai sfuggire a questi personaggi, ma a essere onesti, sospetto che tu debba "sfuggire" all'intera stringa. Base64 che codifica la stringa potrebbe funzionare, ma potresti anche guardare MTOM o qualche altro meccanismo di trasmissione di dati binari attraverso i servizi web.

Se si possiedono entrambi i lati di questo sistema (i client e il servizio Web), non dovrebbe essere troppo difficile aggiungere i passaggi di codifica/decodifica e la codifica di base64 dovrebbe essere sufficiente.

+0

purtroppo no !! Sto solo sviluppando il servizio web !! E normalmente ricevo una stringa dal terminale !!! –

+0

Quindi, stai definendo il contratto e la semantica della messaggistica se possiedi il servizio. Ciò ti consente di dire "inviami XML valido" o di "codificare il testo", vero? –

+0

L'unica situazione in cui ciò non si verifica è dove si sta implementando un contratto di assistenza noto e il cliente non può essere modificato. –

1

Man mano che si forma l'XML che verrà inserito nella busta XML SOAP, è necessario assicurarsi di non avere caratteri senza caratteri di escape nei valori degli attributi e in tutti i nodi di testo presenti nei propri elementi. Cioè:

<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> 

Presumo si sta facendo questo in Java, quindi si dovrebbe guardare in librerie che fanno questo per voi automaticamente. Apache ha StringEscapeUtils, per esempio.

I caratteri di controllo devono essere preceduti dall'XXML. Speriamo che StringEscapeUtils gestisca ciò per te.

Spero che questo aiuti.

+0

Penso che questo sia quello che sto cercando !!! Ci proverò! Grazie :)) –

1

utilizzare CDATA per i dati che non fanno parte della struttura xml (vale a dire il contenuto), se ho capito correttamente e stai appena instradando messaggi questo è quello che dovresti fare.

Problemi correlati