XMLException при обработке RSS
Я пытался обрабатывать RSS-каналы, используя Argotic для моего приложения для чтения новостей. Для большинства из них это работает нормально, но на некоторых каналах ( таких как это) это ломается со следующим:
Дополнительная информация: Из соображений безопасности DTD запрещен в этом документе XML. Чтобы включить обработку DTD, установите для свойства DtdProcessing в XmlReaderSettings значение Parse и передайте настройки в метод XmlReader.Create.
Ошибка была проста, я прошел XMLReaderSettings
объект с DtdProcessing
включен. Но затем появилось следующее:
Произошло необработанное исключение типа "System.Xml.XmlException" в System.Xml.dll Дополнительная информация: ";" символ, шестнадцатеричное значение 0x3B, не может быть включено в имя. Строка 9, позиция 366.
Код, который я использую:
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.IgnoreWhitespace = true;
settings.DtdProcessing = DtdProcessing.Parse;
XmlReader reader = XmlReader.Create(this.url, settings);
RssFeed feed = new RssFeed();
feed.Load(reader);
Что мне не хватает?
2 ответа
Кажется, игнорируя DtdProcessing
решил мою проблему.
settings.DtdProcessing = DtdProcessing.Ignore;
Исключение говорит вам, что RSS-канал является незаконным, в частности, что имя содержит ;
персонаж. Спецификация W3C, по- видимому, запрещает это:
Авторам документов рекомендуется использовать имена, которые являются значимыми словами или комбинациями слов на естественных языках, и избегать использования символьных или пробельных символов в именах. Обратите внимание, что COLON, HYPHEN-MINUS, FULL STOP (точка), LOW LINE (подчеркивание) и MIDDLE DOT явно разрешены.
Символы ASCII и знаки препинания, а также довольно большая группа символов символов Unicode исключаются из имен
Так как другие читатели RSS также жаловались, фид, вероятно, был недействительным. Однако на момент написания этой статьи валидатор W3C показывает, что он действителен!
Согласно документации MSDN для XmlReaderSettings.ConformanceLevel, эта проблема вызовет исключение независимо от того, ConformanceLevel
, но вы можете найти другой параметр в XmlReaderSettings, который может отключить поведение (укажите параметры для XmlReader.Create). В противном случае, если канал не может быть исправлен, вам придется выполнить некоторую предварительную обработку для него.