2009-05-12 27 views
12

Sto lavorando a un piccolo progetto che sta ricevendo dati XML in forma di stringa da un'applicazione in esecuzione prolungata. Sto cercando di caricare questi dati di stringa in un XDocument (System.Xml.Linq.XDocument), e da lì in poi alcuni XML Magic e creare un file xlsx per un report sui dati.Eccezione XML: Carattere non valido

A volte, ricevo i dati con caratteri XML non validi e, quando provo ad analizzare la stringa in un XDocument, viene visualizzato questo errore.

[System.Xml.XmlException] Messaggio: '?', Valore esadecimale 0x1C, è un carattere non valido.

Poiché non ho alcun controllo sull'applicazione remota, è possibile aspettarsi QUALSIASI tipo di carattere.

Sono ben consapevole del fatto che XML ha un modo in cui è possibile inserire caratteri come &#x1C o qualcosa del genere.

Se possibile, mi piacerebbe SERIAMENTE conservare TUTTI i dati. Se no, lascia che sia.


ho pensato di modificare la stringa di risposta programatically, poi tornare indietro e cercando di ri-analizzare dovrebbe un'eccezione essere gettato, ma ho provato un paio di metodi e nessuno di loro sembra di successo.

Grazie per il vostro pensiero.

Codice è qualcosa lungo la linea di questo:

TextReader tr; 
XDocument doc; 

string   response; //XML string received from server. 
... 
tr = new StringReader (response); 

try 
{ 
    doc = XDocument.Load(tr); 
} 
catch (XmlException e) 
{ 
    //handle here? 
} 

risposta

11

XML può gestire praticamente qualsiasi carattere, ma ci sono intervalli, control codes and such, che non lo faranno.

La tua migliore scommessa, se non riesci a farli correggere l'output, è quello di disinfettare i dati grezzi che stai ricevendo. È necessario sostituire i caratteri non validi con il formato di riferimento dei caratteri che hai notato.

(Non si può nemmeno ricorrere a CDATA, in quanto non v'è alcun modo per sfuggire a questi personaggi lì.)

0

Se il vostro ingresso non è XML, è necessario utilizzare qualcosa come Tidy o Tagsoup per pulire il pasticcio.

Prenderanno qualsiasi input e tenteranno, si spera, di creare un DOM utile.

Non so quanto siano rilevanti le librerie dei dark side.

9

Sarebbe utile qualcosa come descritto in this blog post?

Fondamentalmente, crea un flusso xml sanificante.

+0

In realtà, sta elaborando un XML tutto in una volta, come una stringa. –

+0

@Matthew, sì, questo è l'esempio in cui chiama .ReadToEnd(), ma si può semplicemente usare .Read(), ecc. La mia ipotesi è che l'OP dovrà fare quello che hai detto. –

+0

Questo collegamento era estremamente utile – Meiscooldude

0

Garbage In, Garbage Out. Se l'applicazione remota ti sta mandando dei rifiuti, allora è tutto ciò che otterrai. Se pensano di inviare XML, devono essere corretti. In questo caso, non stai facendo loro alcun favore lavorando intorno al loro bug.

Si dovrebbe anche assicurarsi di ciò che pensano di inviare. Cosa significava% 1C per loro? Cosa volevano che fosse?

+1

Vorrei essere in grado di correggere il loro errore, ma non lo sono ... Il bug viene dall'input dell'utente non filtrato ... Alcuni utenti decidono di inserire alcuni personaggi super strani ... e lo accetta. .. – Meiscooldude

+0

La mia raccomandazione sarebbe quella di rifiutare la spazzatura, quindi produrre un rapporto che mostra ciò che è stato respinto. Quindi inviare tale rapporto al proprietario del codice buggy, almeno una volta al mese. –

0

IMHO la soluzione migliore sarebbe quella di modificare il codice/programma/qualsiasi prodotto l'XML non valido che viene alimentato al programma. Sfortunatamente questo non è sempre possibile. In questo caso è necessario sfuggire a tutti i caratteri < 0x20 prima di provare a caricare il documento.

0

Se davvero non è possibile correggere i dati XML di origine, prendere in considerazione l'adozione di un approccio come quello descritto in this answer. Fondamentalmente, si crea una sottoclasse TextReader (ad esempio, StripTextReader) che racchiude un TextReader (tr) esistente e scarta caratteri non validi.

+0

La tua risposta implica che i personaggi sono davvero spazzatura. Che tutto ciò che deve fare è eliminarli. Ho suggerito che dovrebbe prima scoprire che cosa dovrebbero essere quei personaggi. –

14

È possibile utilizzare il XmlReader e impostare le XmlReaderSettings.CheckCharacters proprietà falso . Questo ti permetterà di leggere il file XML nonostante i caratteri non validi. Da lì è possibile importarlo per passarlo a un oggetto XmlDocument o XDocument.

È possibile leggere un po 'di più sul mio blog.

per caricare i dati ad un System.Xml.Linq.XDocument apparirà un po 'simile a questa:

XDocument xDocument = null; 
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false }; 
using (XmlReader xmlReader = XmlReader.Create(filename, xmlReaderSettings)) 
{ 
    xmlReader.MoveToContent(); 
    xDocument = XDocument.Load(xmlReader); 
} 

Maggiori informazioni possono essere trovate here.

+2

** Collegamenti correlati su MSDN: ** [Proprietà XmlReaderSettings.CheckCharacters] (http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.checkcharacters%28v=vs.110%29.aspx) e [Metodo XmlReader.MoveToContent] (http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.movetocontent%28v=vs.110%29.aspx). – DavidRR

Problemi correlati