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

Другие вопросы по тегам