Как изменить кодировку символов XmlReader - PullRequest
21 голосов
/ 07 июня 2009

У меня есть простой 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 ]

35 голосов
/ 07 июня 2009

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

4 голосов
/ 07 июня 2009

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

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

<?xml version="1.0" encoding="ISO-8859-9"?>
2 голосов
/ 07 июня 2009

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

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

Существует свойство XmlReaderSettings.CheckCharacters - справка для следующих состояний:

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

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

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

Так что дальнейшее расследование оправдано.

0 голосов
/ 06 февраля 2013

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

System.Text.Encoding.UTF8.GetString(YourXmlTextReader.Encoding.GetBytes(YourXmlTextReader.Value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...