Важным аргументом здесь является то, что использование psr-4 или psr-0 в composer.json вынуждает организовывать файлы классов в соответствии со строгим стандартом. Это позволяет другим (или вам самим через 2 года), которые смотрят на composer.json, сразу узнать, где находятся ваши классы.
Если вы делаете это неправильно, например, если вы ошиблись в написании пространства имен, вы, скорее всего, узнаете об этом во время разработки или в своих модульных тестах из-за «класса не найден». Это хорошо, потому что заставляет вас это исправить.
Карта классов намного более простительна и позволит любую произвольную организацию файлов классов, оставляя читателя в неведении.
Итак, как уже говорили другие: используйте psr-4 или psr-0 в composer.json, работайте с этим во время разработки, а затем рассмотрите опцию -o для производства. Но оцените, действительно ли это приносит выигрыш в производительности!
Чтобы заставить .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 отключает проверку символов для ссылок на символьные сущности.
Таким образом, дальнейшее расследование необходимо.