Приложение Windows Form находит ссылку в Интернете

Мне нужно создать метод, который найдет самую новую версию приложения на веб-сайте (сервер Hudson) и позволит ее загрузить.

до сих пор я использую регулярное выражение для сканирования всего HTML и поиска тегов href и поиска строки, которую я хочу.

Я хочу знать, есть ли самый простой способ сделать это. Я приложил код, который я использую сегодня:

namespace SDKGui
{
    public struct LinkItem
    {
        public string Href;
        public string Text;

    public override string ToString()
    {
        return Href;
    }
}

static class LinkFinder
{
    public static string Find(string file)
    {
        string t=null;
        List<LinkItem> list = new List<LinkItem>();

        // 1.
        // Find all matches in file.
        MatchCollection m1 = Regex.Matches(file, @"(<a.*?>.*?</a>)",
            RegexOptions.Singleline);


        // 2.
        // Loop over each match.
        foreach (Match m in m1)
        {
            string value = m.Groups[1].Value;
            LinkItem i = new LinkItem();

            // 3.
            // Get href attribute.
            Match m2 = Regex.Match(value, @"href=\""(.*?)\""",
            RegexOptions.Singleline);
            if (m2.Success)
            {
                i.Href = m2.Groups[1].Value;
            }

            // 4.
            // Remove inner tags from text.
            t = Regex.Replace(value, @"\s*<.*?>\s*", "",
            RegexOptions.Singleline);

            if (t.Contains("hms_sdk_tool_"))
            {
                i.Text = t;
                list.Add(i);
                break;
            }



        }
        return t;
    }

}
}

person almog50    schedule 26.05.2015    source источник
comment
Что не так с твоей попыткой?   -  person Renatas M.    schedule 26.05.2015
comment
Почему бы вам просто не сослаться на статический URL-адрес из вашего приложения, и эта страница перенаправит пользователя на последнюю версию. Что-то вроде www.mysoftware.com/latest   -  person Stealth Rabbi    schedule 26.05.2015
comment
Извините, я забыл отметить, имя загружаемого файла меняется, когда новая сборка завершена.   -  person almog50    schedule 26.05.2015
comment
@almog50: Рассматривали ли вы возможность использования HtmlAgilityPack для сбора href значений? Если да, я могу предоставить ответ, показывающий, как это можно сделать.   -  person Wiktor Stribiżew    schedule 26.05.2015


Ответы (1)


С помощью HtmlAgilityPack легко собрать все значения href и отфильтровать по любому из ваших условий. Следующий метод показывает, как получить доступ к странице, получить все теги <a> и вернуть список всех значений href, содержащих hms_sdk_tool_:

private List<string> HtmlAgilityCollectHrefs(string url)
{
    var webGet = new HtmlAgilityPack.HtmlWeb();
    var doc = webGet.Load(url);
    var a_nodes = doc.DocumentNode.SelectNodes("//a");
    return a_nodes.Select(p => p.GetAttributeValue("href", "")).Where(n => n.Contains("hms_sdk_tool_")).ToList();
}

Или, если вас интересует 1 возвращаемая строка, используйте

private string GetLink(string url)
{
    var webGet = new HtmlAgilityPack.HtmlWeb();
    var doc = webGet.Load(url);
    var a_nodes = doc.DocumentNode.SelectNodes("//a");
    return a_nodes.Select(p => p.GetAttributeValue("href", "")).Where(n => n.Contains("hms_sdk_tool_")).FirstOrDefault();
}
person Wiktor Stribiżew    schedule 26.05.2015