Как изменить кодировку символов 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))
Другие вопросы по тегам