C#. SgmlReader. Обновления с www.w3.org
От: _Helg_ Россия  
Дата: 25.06.09 10:00
Оценка:
Добрый день!

Достаю страницу через

HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);


Затем пытаюсь перевести html в xml, чтобы использую xpath можно было достучаться до нужного элемента. Перевожу с помощью SgmlReader.

Использовал статью и код проекта отсюда: http://blogs.gotdotnet.ru/personal/poigraem/PermaLink.aspx?guid=d0fd3f90-d3e4-4940-a62b-4fcfc172b85e

В итоге, простые сайты (или точнее, хорошо структурированные) типа yandex.ru SgmlReader парсит на ура, но с более сложными — лезет на сайт http://www.w3.org/ и скачивает обновления, что ли?

Фидлер показывает:

GET http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
200 OK

GET http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
200 OK

GET http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
200 OK

GET http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
200 OK

А как можно это все скачать и подложить куда-нибудь в папку солюшина?
А то на каждый запрос к SgmlReaderу он лезет и скачивает эти файлы...

Как я понял, это происходит в случае, если в заголовке страницы стоит:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Как это можно побороть?
Re: C#. SgmlReader. Обновления с www.w3.org
От: Воронков Василий Россия  
Дата: 25.06.09 10:08
Оценка:
Здравствуйте, _Helg_, Вы писали:

У вас ведь есть код SqmlReader? Надо посмотреть как он лезет за этими файлами — и возможно придется самому прикручивать кэшеривания, если файлы не менялись.
Re: C#. SgmlReader. Обновления с www.w3.org
От: Ovl Россия  
Дата: 25.06.09 10:17
Оценка:
_H_>Как это можно побороть?

поскольку doctype здесь html, то можно воспользоваться тем, что он пытается загрузить ресурс и вставить сюда свой кусочек кода, подменив имя ресурса, например.


if (_docType != null && _docType.ToLower() == "html") {
   Assembly a = typeof(SgmlReader).Assembly;
   string name = a.FullName.Split(',')[0]+".Html.dtd";
   Stream stm = a.GetManifestResourceStream(name);
   StreamReader sr = new StreamReader(stm);
   _dtd = SgmlDtd.Parse(baseUri, "HTML", null, sr, null, _proxy, _nametable);
}
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: C#. SgmlReader. Обновления с www.w3.org
От: _Helg_ Россия  
Дата: 25.06.09 11:03
Оценка:
Здравствуйте, Ovl, Вы писали:


_H_>>Как это можно побороть?


Ovl>поскольку doctype здесь html, то можно воспользоваться тем, что он пытается загрузить ресурс и вставить сюда свой кусочек кода, подменив имя ресурса, например.


Хм,
например, сделать stream на локальный файл?
Re: C#. SgmlReader. Обновления с www.w3.org
От: Аноним  
Дата: 25.06.09 11:32
Оценка: +2
Здравствуйте, _Helg_, Вы писали:
_H_>А как можно это все скачать и подложить куда-нибудь в папку солюшина?
_H_>А то на каждый запрос к SgmlReaderу он лезет и скачивает эти файлы...
_H_>Как это можно побороть?

Посмотри в сторону XmlResolver, вернее класа от него производного.
Нужно будет перегрузить методы ResolveUri и GetEntity. Не знаю как работает SgmlReader,
и можно ли туда прикрутить XmlResolver, но то что данный способ поможет не лезть каждый раз на сервер — это точно.
На RSDN где-то был пример кода.
Re[3]: C#. SgmlReader. Обновления с www.w3.org
От: Ovl Россия  
Дата: 25.06.09 12:10
Оценка:
Здравствуйте, _Helg_, Вы писали:

_H_>Здравствуйте, Ovl, Вы писали:



_H_>>>Как это можно побороть?


Ovl>>поскольку doctype здесь html, то можно воспользоваться тем, что он пытается загрузить ресурс и вставить сюда свой кусочек кода, подменив имя ресурса, например.


_H_>Хм,

_H_>например, сделать stream на локальный файл?

например, да. вариантов много. файл или такой же embedded ресурс
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.