Проблема с чтением RSS - ожидаемая разметка DTD не найдена

Я открываю XML-файл, который ссылается на DTD следующим образом:

<?xml version="1.0" encoding="windows-1250"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
     "http://my.netscape.com/publish/formats/rss-0.91.dtd">

Вот часть кода C #:

public static XmlDocument FromUri(string uri) 
 {

    XmlDocument xmlDoc;
    WebClient webClient = new WebClient();

    using (Stream rssStream = webClient.OpenRead(uri))
    {
        XmlTextReader reader = new XmlTextReader(rssStream);
        xmlDoc = new XmlDocument();
        xmlDoc.XmlResolver = null;
        xmlDoc.Load(reader);
    }
    return xmlDoc;
}

Когда я пытаюсь загрузить «читатель», я получаю следующую ошибку: Ожидаемая разметка DTD не найдена. Есть ли способ заставить парсер игнорировать элемент Doctype? А может, я могу сделать что-нибудь более эффективное?


person Nikolan    schedule 30.09.2009    source источник


Ответы (2)


Пока DTD не определяет какой-либо &entities;, который вам нужно использовать (вместо этого используйте символьные ссылки!), Вы можете указать XmlTextReader не включать внешние объекты (включая DTD), установив XmlResolver на null.

(На самом деле это должно было быть по умолчанию. В большинстве случаев, когда вы читаете XML-документ, вы не хотите, чтобы он отправлялся на загрузку DTD, даже когда DTD все еще присутствует. В этом случае AOL вела себя особенно плохо не только удаление DTD, но предоставление неправильного ответа 301 на некоторый HTML вместо соответствующего 404.)

person bobince    schedule 30.09.2009

http://my.netscape.com/publish/formats/rss-0.91.dtd приводит к 301, который, в свою очередь, направляется на http://netscape.aol.com/index.html

т.е. по этому URL-адресу нет DTD.

person Stephane    schedule 30.09.2009