将 "code" 增加 1 的有效方法 - HtmlAgilityPack

Efficient method to increase "code" by 1 - HtmlAgilityPack

我正在开发一个应用程序,该应用程序可以从游戏页面 ( 中提取 内容 (example),并将其显示给文本框中的用户,如果用户希望这样做,he/she 可以将其保存为 .txt 文件或 .xsl(excel 电子表格格式)。

但是我现在面临的主要问题是您必须手动将代码更改 "extract" 关于另一个游戏内单位的数据。

如果你打开 link 你会看到我正在提取 "Weapons" , "Used", "Survived""Casualties" 来自防御方(目前),但只有一种类型的单位(更像是只有 table 的一排)"extracted",我正在寻找一种搜索方式"tr[1]/td[2]/span[1]" 到 "tr[45]/td[2]/span[1]"(即使示例页面只显示到 tr[16]),或者可能是一种自动搜索的方法,直到找不到数据(什么都没有)然后它就会停止。

对于任何文本错误,我深表歉意,我不是母语人士

private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        HtmlDocument brPage = new HtmlWeb().Load("http://us.desert-operations.com/world2/battleReport.php?code=f8d77b1328c8ce09ec398a78505fc465");
        HtmlNodeCollection nodes = brPage.DocumentNode.SelectNodes("/html[1]/body[1]/div[1]/div[1]/div[3]/div[1]/div[1]/div[1]/div[2]/table[2]");
        string result = "";
        List<brContentSaver> ContentList = new List<brContentSaver>();
        foreach (var item in nodes)
        {
            brContentSaver cL = new brContentSaver();
            /*  Here comes the junk handler, replaces all junk for nothing, essentially deleting it
                I wish I knew a way to do this efficiently  */
            cL.Weapons = item.SelectSingleNode("tr[16]/td[1]").InnerText
                .Replace("&nbsp;*&nbsp;", " ")
                .Replace("&nbsp ; *&nbsp ;", " ");

            cL.Used = item.SelectSingleNode("tr[16]/td[2]/span[1]").InnerText
                .Replace("&nbsp;*&nbsp;", " ")
                .Replace("&nbsp ; *&nbsp ;", " ");

            cL.Survived = item.SelectSingleNode("tr[16]/td[3]").InnerText
                .Replace("&nbsp;*&nbsp;", " ")
                .Replace("&nbsp ; *&nbsp ;", " ");

            if (cL.Survived == "0")
            {
                cL.Casualties = cL.Used;
            } else
            {
                /*  int Casualties = int.Parse(cL.Casualties);
                 *  int Used = int.Parse(cL.Used);
                 *  int Survived = int.Parse(cL.Survived);

                 *  Casualties = Used - Survived;   */

                 cL.Casualties = item.SelectSingleNode("tr[16]/td[4]").InnerText
                 .Replace("&nbsp;*&nbsp;", " ")
                 .Replace("&nbsp ; *&nbsp ;", " ");
            }

            ContentList.Add(cL);
        }

        foreach (var item in ContentList)
        {
            result += item.Weapons + " " + item.Used + " " + item.Survived + " " + item.Casualties + Environment.NewLine;
        }
        brContent.Text = result;

    }

对不起,如果这听起来很傻,但我是编程新手,尤其是 C#。

编辑 1:我注意到 "if (cL.Survived == "0")",我之前只是在测试一些东西,但我忘了更改它,但是嘿,它有效

编辑 2:如果您想知道我也在使用这个:

public class brContentSaver
{

    public string Weapons
    {
        get;
        set;
    }

    public string Used
    {
        get;
        set;
    }

    public string Survived
    {
        get;
        set;
    }
    public string Casualties
    {
        get;
        set;
    }
}

我没有太多时间写这篇文章,但如果您仍然需要,希望它能对您有所帮助。我发现 Linq 更方便:

private static void Run()
{
    HtmlDocument brPage = new HtmlWeb().Load("http://us.desert-operations.com/world2/battleReport.php?code=f8d77b1328c8ce09ec398a78505fc465");
    var nodes = brPage.DocumentNode.Descendants("table").Where(_ => _.Attributes["class"] != null && _.Attributes["class"].Value != null && _.Attributes["class"].Value.Contains("battleReport"));
    string result = "";
    List<brContentSaver> ContentList = new List<brContentSaver>();
    foreach (var item in nodes)
    {
        if (item.Descendants("th").Any(_ => _.InnerText.Equals("Weapons")))
        {
            //get all tr nodes except first one (header)
            var trNodes = item.Descendants("tr").Skip(1);
            foreach (var node in trNodes)
            {
                brContentSaver cL = new brContentSaver();
                var tds = node.Descendants("td").ToArray();
                /*  Here comes the junk handler, replaces all junk for nothing, essentially deleting it
                    I wish I knew a way to do this efficiently  */
                cL.Weapons = tds[0].InnerText
                    .Replace("&nbsp;*&nbsp;", " ")
                    .Replace("&nbsp ; *&nbsp ;", " ");

                cL.Used = tds[1].Descendants("span").FirstOrDefault()?.InnerText
                    .Replace("&nbsp;*&nbsp;", " ")
                    .Replace("&nbsp ; *&nbsp ;", " ");
                if (string.IsNullOrEmpty(cL.Used))
                {
                    cL.Used = tds[1].InnerText;
                }

                cL.Survived = tds[2].Descendants("span").FirstOrDefault()?.InnerText
                    .Replace("&nbsp;*&nbsp;", " ")
                    .Replace("&nbsp ; *&nbsp ;", " ");

                if (string.IsNullOrEmpty(cL.Survived))
                {
                    cL.Casualties = cL.Used;
                }
                else
                {
                    /*  int Casualties = int.Parse(cL.Casualties);
                     *  int Used = int.Parse(cL.Used);
                     *  int Survived = int.Parse(cL.Survived);

                     *  Casualties = Used - Survived;   */

                    cL.Casualties = tds[3].Descendants("span").FirstOrDefault()?.InnerText
                    .Replace("&nbsp;*&nbsp;", " ")
                    .Replace("&nbsp ; *&nbsp ;", " ");

                    if (string.IsNullOrEmpty(cL.Casualties))
                    {
                        cL.Casualties = tds[3].InnerText;
                    }
                }

                ContentList.Add(cL);
            }
        }
    }

    foreach (var item in ContentList)
    {
        result += item.Weapons + " " + item.Used + " " + item.Survived + " " + item.Casualties + Environment.NewLine;
    }
    var text = result;

}