2009-06-07 15 views
20

Ho un semplice XmlReader:Come cambiare carattere codifica dei XmlReader

XmlReader r = XmlReader.Create(fileName); 

while (r.Read()) 
{ 
    Console.WriteLine(r.Value); 
} 

Il problema è che il file XML ha ISO-8859-9 caratteri in esso, il che rende XmlReader tiro "Invalid character in the given encoding." eccezione. Posso risolvere questo problema aggiungendo la riga <?xml version="1.0" encoding="ISO-8859-9" ?> all'inizio, ma mi piacerebbe risolverlo in un altro modo nel caso non riesca a modificare il file sorgente. Come posso cambiare la codifica di XmlReader?

risposta

33

Per forzare .NET a leggere il file come ISO-8859-9, è sufficiente utilizzare uno dei molti sovraccarichi XmlReader.Create, ad es.

using(XmlReader r = XmlReader.Create(new StreamReader(fileName, Encoding.GetEncoding("ISO-8859-9")))) { 
    while(r.Read()) { 
     Console.WriteLine(r.Value); 
    } 
} 

Tuttavia, che non può funzionare perché, IIRC, lo standard W3C XML dice qualcosa circa quando la linea dichiarazione XML è stato letto, un parser compatibile dovrebbe passare immediatamente alla codifica specificata nella dichiarazione XML indipendentemente da ciò che codifica che stava usando prima. Nel tuo caso, se il file XML non ha una dichiarazione XML, la codifica sarà UTF-8 e continuerà a fallire. Potrei parlare di sciocchezze qui, quindi provalo e guarda. :-)

+0

Sì, non credo che solo la modifica della codifica di StreamReader funzionerà ... – Noldorin

+1

Ho appena provato, questo ha funzionato. Grazie! – dstr

+1

Attenzione, lo streamreader non viene chiuso dopo la fine dell'istruzione 'using' quando si usa una sintassi come questa. Il modo sicuro sarebbe: 'using (StreamReader sr = new StreamReader (fileName, Encoding.GetEncoding (" ISO-8859-9 "))) utilizzando (XmlReader r = XmlReader.Create (sr)) {...}' –

3

Il XmlTextReader classe (che è ciò che il metodo statico Create è in realtà tornando, in quanto XmlReader è la classe base astratta) è progettato per rilevare automaticamente la codifica del file XML stesso - non c'è modo di impostare manualmente.

Semplicemente assicurare che si include la seguente dichiarazione XML nel file che state leggendo:

<?xml version="1.0" encoding="ISO-8859-9"?> 
2

Se non è possibile garantire che il file di input ha l'intestazione a destra, si poteva guardare uno degli altri 11 overload al metodo XmlReader.Create.

Alcuni di questi prendono una variabile XmlReaderSettings o XmlParserContext o entrambi. Non ho indagato su questi, ma c'è la possibilità che l'impostazione dei valori appropriati possa aiutare qui.

C'è la proprietà XmlReaderSettings.CheckCharacters - l'aiuto per questo afferma:

incarica il lettore di controllare personaggi e un'eccezione se i caratteri sono al di fuori della gamma di caratteri XML legali. Il controllo dei caratteri include il controllo dei caratteri non validi nel documento e il controllo della validità dei nomi XML (ad esempio, un nome XML non può iniziare con un numero).

Quindi l'impostazione su false potrebbe essere d'aiuto. Tuttavia, l'aiuto indica anche:

Se XmlReader sta elaborando dati di testo, verifica sempre che i nomi XML e il contenuto del testo siano validi, indipendentemente dall'impostazione della proprietà. L'impostazione di CheckCharacters su false disattiva il controllo dei caratteri per i riferimenti alle entità dei caratteri.

Quindi ulteriori indagini sono giustificate.

+0

ho trovato CheckCharacters troppo, ma non ha aiutato, almeno nel mio caso .. – dstr

0

Utilizzare un XmlTextReader invece di un XmlReader:

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value)) 
Problemi correlati