2009-06-07 18 views
20

Mam proste XmlReader:Jak zmienić kodowanie znaków XmlReader

XmlReader r = XmlReader.Create(fileName); 

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

Problemem jest to plik XML ISO-8859-9 znaków w nim, co czyni XmlReader rzut „Invalid character in the given encoding.” wyjątek. Mogę rozwiązać ten problem dodając na początku linię <?xml version="1.0" encoding="ISO-8859-9" ?>, ale chciałbym rozwiązać to w inny sposób, na wypadek, gdyby nie można było zmodyfikować pliku źródłowego. Jak mogę zmienić kodowanie XmlReader?

Odpowiedz

33

Aby zmusić .NET do odczytania pliku jako ISO-8859-9, wystarczy użyć jednego z wielu przeciążeń XmlReader.Create, np.

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

jednak, że nie może pracować, bo IIRC, W3C standardem XML mówi coś o tym, kiedy linia deklaracja XML został przeczytany, parser zgodny powinien natychmiast przejść do kodowania określonego w deklaracji XML, niezależnie od tego, kodowanie, z którego korzystało wcześniej. W twoim przypadku, jeśli plik XML nie ma deklaracji XML, kodowanie będzie miało postać UTF-8 i nadal będzie się nie udać. Mogę tu mówić bzdury, więc spróbuj i zobacz. :-)

+0

Tak, nie sądzę, że zmiana kodowania StreamReadera będzie działać ... – Noldorin

+1

Po prostu próbowałem, to zadziałało. Dzięki! – dstr

+1

Należy uważać, program do przesyłania strumieniowego nie jest zamknięty po zakończeniu wyrażenia using przy użyciu składni takiej jak ta. Bezpiecznym sposobem byłoby: 'using (StreamReader sr = new StreamReader (fileName, Encoding.GetEncoding (" ISO-8859-9 "))) przy użyciu (XmlReader r = XmlReader.Create (sr)) {...}' –

3

XmlTextReader klasy (czyli to, co statyczne Create metoda jest rzeczywiście powrocie, ponieważ XmlReader jest abstrakcyjna klasa bazowa) przeznaczony jest do automatycznego wykrywania kodowania z samego pliku XML - nie ma sposobu, aby ustawić go ręcznie.

Wystarczy zapewnić, że obejmują następującą deklarację XML w pliku czytasz:

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

Jeśli nie można zapewnić, że plik wejściowy ma odpowiedniego nagłówka, można spojrzeć na jeden z drugim 11 przeciąża metodę XmlReader.Create.

Niektóre z nich przyjmują zmienną XmlReaderSettings lub XmlParserContext lub obie. Nie badałem ich, ale istnieje możliwość, że ustawienie odpowiednich wartości może pomóc tutaj.

Jest własnością XmlReaderSettings.CheckCharacters - pomoc na ten stwierdza:

zobowiązuje czytelnikowi sprawdzić znaki i wyjątek jeśli wszystkie znaki są poza zasięgiem prawa znaków XML. Sprawdzanie znaków obejmuje sprawdzanie niedozwolonych znaków w dokumencie, a także sprawdzanie poprawności nazw XML (na przykład nazwa XML może nie zaczynać się od cyfry).

Pomocne może być ustawienie tego na false. Jednak pomoc również stwierdza:

Jeśli XmlReader przetwarza dane tekstowe, zawsze sprawdza, czy nazwy XML i treść tekstowa są poprawne, niezależnie od ustawienia właściwości. Ustawienie funkcji CheckCharacters na wartość false powoduje wyłączenie sprawdzania znaków dla odwołań do encji postaci.

Tak więc dalsze dochodzenie jest uzasadnione.

+0

znalazłem CheckCharacters też, ale to nie pomogło, przynajmniej w moim przypadku .. – dstr

0

Użyj XmlTextReader zamiast XmlReader:

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value)) 
Powiązane problemy