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