You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用HtmlAgilityPack获取TacO插件版本及最新版本校验

解决TacO插件版本获取与校验的问题

看起来你在用HtmlAgilityPack处理GW2TacO版本信息时遇到了逻辑问题,我帮你梳理下现有代码的问题,再给出完整的解决方案。

现有代码的核心问题

  • 你在LinkList1节点内用SelectNodes("//li")时,这个XPath是全局搜索所有li标签,而非仅在当前div下查找,会拿到无关节点
  • 你试图从li节点取href属性,但实际上href是在li内部的<a>标签上
  • 代码完全没实现版本号提取、对比逻辑,返回值一直是false,校验功能等于没完成
  • 没有处理SelectNodes返回null的情况,容易引发空引用异常

解决方案实现

第一步:定义版本信息模型类

先创建一个简单类来存储版本号和下载链接,方便后续处理:

public class TacOVersionInfo
{
    public Version Version { get; set; }
    public string DownloadUrl { get; set; }
    public string FullVersionText { get; set; } // 比如"Download Build 034.1866r"
}

第二步:实现获取所有版本信息的方法

这个方法会从页面中提取所有TacO版本的完整信息:

public static List<TacOVersionInfo> GetAllTacOVersions()
{
    var versionList = new List<TacOVersionInfo>();
    var web = new HtmlWeb();
    HtmlDocument doc;
    
    try
    {
        doc = web.Load("http://www.gw2taco.com/");
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"加载页面失败: {ex.Message}");
        return versionList;
    }

    // 定位目标容器:class为widget LinkList且id为LinkList1的div
    var targetDiv = doc.DocumentNode.SelectSingleNode("//div[@class='widget LinkList' and @id='LinkList1']");
    if (targetDiv == null)
    {
        Debug.WriteLine("未找到版本列表容器");
        return versionList;
    }

    // 仅在当前div下查找li节点(注意XPath前的.,表示相对当前节点)
    var liNodes = targetDiv.SelectNodes(".//li");
    if (liNodes == null)
    {
        Debug.WriteLine("未找到版本列表项");
        return versionList;
    }

    foreach (var li in liNodes)
    {
        var aNode = li.SelectSingleNode(".//a");
        if (aNode == null) continue;

        string downloadUrl = aNode.GetAttributeValue("href", string.Empty);
        string versionText = aNode.InnerText.Trim();

        // 从文本中提取版本号:匹配"Build XXXX.YYYYr"格式
        var versionMatch = System.Text.RegularExpressions.Regex.Match(versionText, @"Build (\d+\.\d+r)");
        if (versionMatch.Success)
        {
            string versionStr = versionMatch.Groups[1].Value;
            // 处理Version类不支持的r后缀,替换为.0以便解析
            string cleanVersionStr = versionStr.Replace("r", ".0");
            if (Version.TryParse(cleanVersionStr, out Version version))
            {
                versionList.Add(new TacOVersionInfo
                {
                    Version = version,
                    DownloadUrl = downloadUrl,
                    FullVersionText = versionText
                });
            }
        }
    }

    return versionList;
}

第三步:实现版本校验与最新下载链接获取

基于上面的方法,扩展出版本校验功能:

public static bool Tacoisuptodate(string currentVersionStr, out string latestDownloadUrl)
{
    latestDownloadUrl = string.Empty;
    var allVersions = GetAllTacOVersions();
    
    if (!allVersions.Any())
    {
        Debug.WriteLine("未能获取版本信息");
        return false;
    }

    // 解析当前版本号,同样处理r后缀
    string cleanCurrentVersion = currentVersionStr.Replace("r", ".0");
    if (!Version.TryParse(cleanCurrentVersion, out Version currentVersion))
    {
        Debug.WriteLine("传入的版本号格式无效");
        return false;
    }

    // 找到版本号最大的项(最新版本)
    var latestVersion = allVersions.OrderByDescending(v => v.Version).First();
    latestDownloadUrl = latestVersion.DownloadUrl;

    // 比较版本:当前版本>=最新版本则返回true(已更新)
    return currentVersion >= latestVersion.Version;
}

使用示例

在你的WinForms代码中可以这样调用:

// 获取所有版本信息
var allVersions = GetAllTacOVersions();
foreach (var v in allVersions)
{
    Debug.WriteLine($"版本: {v.Version},下载链接: {v.DownloadUrl}");
}

// 校验版本并获取最新链接
string currentVersion = "034.1866r"; // 替换为用户当前版本号
string latestUrl;
bool isUpToDate = Tacoisuptodate(currentVersion, out latestUrl);

if (isUpToDate)
{
    MessageBox.Show("当前已是最新版本!");
}
else
{
    if (!string.IsNullOrEmpty(latestUrl))
    {
        DialogResult result = MessageBox.Show("发现新版本,是否前往下载?", "版本更新", MessageBoxButtons.YesNo);
        if (result == DialogResult.Yes)
        {
            // 打开下载链接,可直接调用系统浏览器
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(latestUrl) { UseShellExecute = true });
        }
    }
}

关键注意事项

  • XPath相对路径:子节点查询一定要加.(比如.//li),否则会全局搜索导致错误
  • 版本号解析:TacO版本带r后缀,Version类无法直接解析,需做字符串替换,可根据实际版本格式调整逻辑
  • 异常与空值处理:网络请求可能失败、节点可能找不到,必须加判断避免崩溃
  • 下载链接优化:Dropbox默认链接是预览页(dl=0),如果需要直接下载,可将链接中的dl=0改为dl=1

内容的提问来源于stack exchange,提问作者Ketsu_sama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:08:35