Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Чтобы заставить .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, и она все равно будет работать. Я могу говорить здесь глупость, поэтому попробуйте и посмотрите.: -)

Ответ 2

Класс XmlTextReader (это то, что фактически возвращает статический метод Create, так как XmlReader является абстрактным базовым классом) предназначен для автоматического обнаружения кодировки из самого файла XML - нет способа установить его вручную.

Просто убедитесь, что в файл, который вы читаете, включено следующее объявление XML:

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

Ответ 3

Если вы не можете гарантировать, что входной файл имеет правильный заголовок, вы можете посмотреть одну из других 11 перегрузок на метод XmlReader.Create.

Некоторые из них принимают переменную XmlReaderSettings или XmlParserContext, или и то, и другое. Я не исследовал их, но есть вероятность, что здесь могут помочь установка соответствующих значений.

Существует свойство XmlReaderSettings.CheckCharacters - помощь для этого состояния:

Указывает читателю проверять символы и выдавать исключение, если любые символы находятся за пределами допустимых символов XML. Проверка символов включает проверку недопустимых символов в документе, а также проверку правильности имен XML (например, имя XML не может начинаться с цифры).

Поэтому настройка этого параметра на false может помочь. Однако в помощи также говорится:

Если XmlReader обрабатывает текстовые данные, он всегда проверяет правильность имен XML и текстового содержимого независимо от настройки свойства. Установка CheckCharacters в false отключает проверку символов для ссылок на сущность символа.

Поэтому дальнейшее исследование оправдано.

Ответ 4

Используйте XmlTextReader вместо XmlReader:

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