Как изменить кодировку символов XmlReader
У меня есть простой XmlReader:
XmlReader r = XmlReader.Create(fileName);
while (r.Read())
{
Console.WriteLine(r.Value);
}
Проблема в том, что файл XML имеет ISO-8859-9
символы в нем, что заставляет XmlReader бросить "Invalid character in the given encoding.
"Исключение. Я могу решить эту проблему с добавлением <?xml version="1.0" encoding="ISO-8859-9" ?>
в начале строки, но я бы хотел решить эту проблему по-другому, если я не могу изменить исходный файл. Как я могу изменить кодировку XmlReader?
4 ответа
Чтобы заставить.NET считывать файл как ISO-8859-9, просто используйте одну из многочисленных перегрузок XmlReader.Create, например:
using(XmlReader r = XmlReader.Create(new StreamReader(fileName, Encoding.GetEncoding("ISO-8859-9")))) {
while(r.Read()) {
Console.WriteLine(r.Value);
}
}
Однако это может не сработать, потому что IIRC, стандарт W3C XML, говорит о том, что после прочтения строки объявления XML совместимый синтаксический анализатор должен немедленно переключиться на кодировку, указанную в объявлении XML, независимо от того, какую кодировку он использовал ранее. В вашем случае, если XML-файл не имеет XML-декларации, кодировка будет UTF-8 и все равно не удастся. Я могу говорить глупости здесь, так что попробуйте и посмотрите.:-)
XmlTextReader
класс (который является то, что статический Create
метод на самом деле возвращается, так как XmlReader
является абстрактным базовым классом), предназначенным для автоматического определения кодировки из самого файла XML - его невозможно установить вручную.
Просто убедитесь, что вы включили следующее XML-объявление в файл, который вы читаете:
<?xml version="1.0" encoding="ISO-8859-9"?>
Если вы не можете убедиться, что входной файл имеет правильный заголовок, вы можете посмотреть на одну из других 11 перегрузок в методе XmlReader.Create.
Некоторые из них занимают XmlReaderSettings
переменная или XmlParserContext
переменная или оба. Я не исследовал их, но есть вероятность, что установка соответствующих значений может помочь здесь.
Существует свойство XmlReaderSettings.CheckCharacters - справка для следующих состояний:
Указывает читателю проверять символы и генерировать исключение, если какие-либо символы находятся за пределами допустимых символов XML. Проверка символов включает проверку на недопустимые символы в документе, а также проверку правильности имен XML (например, имя XML может не начинаться с цифры).
Так что установив это false
может помочь. Однако в справке также говорится:
Если XmlReader обрабатывает текстовые данные, он всегда проверяет правильность имен XML и текстового содержимого независимо от настройки свойства. Установка CheckCharacters в false отключает проверку символов для ссылок на сущности символов.
Так что дальнейшее расследование оправдано.
Использовать XmlTextReader
вместо XmlReader
:
System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value))