Pull to refresh

Comments 24

Расскажите об анализе данных на странице. Допустим поиск нерегулярного шаблона, например, цены на страницах разных интернет-магазинов с неизвестной структурой dom дерева.
Открываю FireBug, смотрю что где. Запоминаю нужный элемент либо по id либо по классу либо по позиции. Выдираю этот кусочек HTML, смотрю well-formed или нет. Корректирую ошибки, делаю мэппинг. Ну и дальше все как обычно.
с неизвестной структурой dom дерева
ну обобщенным поиском я вообще не занимаюсь. это затратно, и если информация не структурирована, вы просто теряете время.
а тот, кто сможет не теряя время структурировать получает — profit)
все что дает компания Microsoft в .Net для XSLT – настоящее убожество
Можно поподробнее, в чём убогость? Недавно кидал распарсенные данные в SQL-дамп через XSLT — всё было в порядке.

А для того чтобы замапить валидный XML в структуру данных достаточно воспользоваться LINQ to XML и не городить кучу платных инструментов. Ну да, нужно .NET 3.5.
Убогость в двух вещах: плохой поддержке XSLT и отсутствия поддержки XQuery. Мне кажется очень плохо что этого нет в .Net-е.

Да, мапить можно через Linq to XML. Да можно вообще вручную через XPath от HTML Agility Pack. Но я так не делаю т.к. мне нужно более организованно управлять мэппингами, быстро реагировать на изменения и по возможности сохранять накопленный ноу-хау.
Ну так я и пытаюсь выяснить у вас, в чём заключается плохая поддержка XSLT в .NET. А то может я чего-то не знаю :)
мне нужно более организованно управлять мэппингами, быстро реагировать на изменения
Опять не понял. Много красивых слов вижу, сути не вижу. Вы вообще LINQ пользовались? Вместо того, чтобы написать элементарный код, чрезвычайно похожий (внимание!) на XQuery, вы городите преобразование CLR в XSD, потом прогоняете это через сторонний XSLT-парсер при этом пишете в статье в каждом абзаце какой это геморрой. А всего-то и надо, что заполнить данными экземпляр класса. Может быть я всё-таки немного не понимаю, чего вы хотите добиться, но навскидку — LINQ тут был бы идеальным и бескровным решением.
В .Net-овом XSLT не поддерживается очень много функций и фич, без которых в XSLT играть неинтересно.

Да, я знаю что можно использовать LINQ. Но мэппинг — это серьезное, промышленное решение, а не быстрая отписка. Мэппинги себя окупают, да и создание их никаких проблем не вызывает.
Ну приведите пример того, что не поддерживается в .NET для XSLT. Я уже в который раз пытаюсь услышать конкретику.

То есть вы считаете, LINQ это не серьёзное промышленное решение, а ваш самописный геморрой с толпой преобразований и кучей ненужных платных инструменов — да? Забавно :)
А вот бесплатная штука для трансформации данных — www.talend.com
Мощная и удобная!
Занимался написанием грабберов сайтов, с последующим парсингом содержимого. Могу посоветовать следующий код который нравится лично мне:
public static XmlDocument LoadFromUrlAsXML(string url, CookieContainer contayner)
    {
      using (SgmlReader reader = new SgmlReader { InputStream = new StringReader(CleanString(WebDownloader.GetString(EncodeCyrUrl(url), null, (byte[])null, contayner))) })
      {
        if (!url.Contains("://")) url = String.Format("http://{0}", url);
        XmlDocument doc = new XhtmlDocument(reader.NameTable);
        doc.Load(reader);
        reader.Close();
        return doc;
      }
    }


* This source code was highlighted with Source Code Highlighter.


В итоге получим XML документ, с которым приятно работать.
То есть вы хотите сказать что если документ по Url плохо сформирован то связка SgmlReader-XhtmlDocument его выправят?
Я хочу сказать что используя данный метод у меня ни разу не возникло проблем. Сграббил 6 сайтов, которые были написаны на 3-х разных движках. Я не гарантирую на 100% что такой метод сработает на всех сайтах сети, но на большинстве думаю точно.
Стоп, а что за метод CleanString()? Читинг? =)
Промазал, код ниже в комментах.
Есть немного=)
/// <summary>
/// Используется чтобы оставить только содержимое HTML части, для более удобного приведения к XML виду
/// </summary>
private static string CleanString(string str)
{
return str.Substring(str.IndexOf("<html", StringComparison.OrdinalIgnoreCase), str.IndexOf("</html>", StringComparison.OrdinalIgnoreCase) - str.IndexOf("<html", StringComparison.OrdinalIgnoreCase) + 6);
}


* This source code was highlighted with Source Code Highlighter.
Вооот, а раз так, ваш метод загрузки в XmlDocument не нужен — это вообще вчерашний день, сегодня есть XElement.Parse()
Ну тогда спасибо за наводку, изучу на досуге.
Лично я всегда пользовался watin-ом для подобных целей. watin.sourceforge.net/
Возможно немного не то (открывается окно браузера), но быстро используемое и очень удобное средство
Вы наверное не читали первую часть серии =)
mezastel, а для валидации данных в xml по определенным правилам что используете? (минимальная длинна строки, дата в будущем итд)
Sign up to leave a comment.

Articles