Как добавить анализ документа (определённая часть HTML файла)?

Моя программа при выполнении формирует таблицу с гиперссылками на html файлы в виде таблицы

введите сюда описание изображения

Мне нужно сделать так чтобы справа от этих ссылок отображалась часть информации от этих файлов (всё до collapse).
Результат выполнения.

А именно результат выполнения, пример того что должно отображаться:

введите сюда описание изображения

Многие советуют использовать html agility pack, но я не понимаю как это правильно прописать в своей программе и никогда до этого с этим не работал. Код:

private void button3_Click(object sender, EventArgs e)
{
    string path = textBox1.Text;
    string result = "<html><body><table cellspacing=\"0\" border=\"1\"><tr><th>Файл</th></tr>[CELLS]</table></body></html>";
    string cells = "";
    string[] files = Directory.GetFiles(path, "*.html");
    // Пробегаем по каждому файлу и записываем его в cells
    foreach (string file in files)
    {
        cells += $"<tr><td><a href=\"file:///{Path.GetFullPath(file)}\">{Path.GetFileName(file)}</a></td></tr>";
    }
    result = result.Replace("[CELLS]", cells);
    SaveFileDialog saveFileDialog = new SaveFileDialog() { Filter = "HTML Web Page (*.html) |*.html" };
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        File.WriteAllText(saveFileDialog.FileName, result);
    }
}

Здесь лежит сама программа и html файлы: Drive Google


Ответы (1 шт):

Автор решения: aepot

Установите NuGet пакет HtmlAgilityPack, потом:

using HtmlAgilityPack;

Получается вот такой метод

private static string FilesListToHtmlTable(string[] files)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    HtmlNode table = doc.DocumentNode.AppendChild(doc.CreateElement("html")).AppendChild(doc.CreateElement("body")).AppendChild(doc.CreateElement("table"));
    table.Attributes.Add("cellspacing", "0");
    table.Attributes.Add("border", "1");
    table.AppendChild(doc.CreateElement("tr")).AppendChild(doc.CreateElement("th")).InnerHtml = "Файл";

    foreach (string file in files)
    {
        HtmlNode row = table.AppendChild(doc.CreateElement("tr"));

        HtmlNode link = row.AppendChild(doc.CreateElement("td")).AppendChild(doc.CreateElement("a"));
        link.Attributes.Add("href", $"file:///{Path.GetFullPath(file)}");
        link.InnerHtml = Path.GetFileName(file);

        HtmlNode cell = row.AppendChild(doc.CreateElement("td"));

        HtmlAgilityPack.HtmlDocument fileDoc = new HtmlAgilityPack.HtmlDocument();
        fileDoc.LoadHtml(File.ReadAllText(file));
        HtmlNodeCollection nodes = fileDoc.DocumentNode.SelectNodes("//script") ?? new HtmlNodeCollection(null);

        foreach (HtmlNode node in nodes)
        {
            if (node.InnerHtml.Trim().StartsWith("document.getElementById"))
            {
                string text = node.InnerHtml.Split('"')[1].Trim();
                cell.InnerHtml += text;
                cell.AppendChild(doc.CreateElement("br"));
            }
        }
    }
    return doc.DocumentNode.InnerHtml;
}

И вот так его использовать

private void button3_Click(object sender, EventArgs e)
{
    string[] files = Directory.GetFiles(textBox1.Text, "*.html");
    SaveFileDialog saveFileDialog = new SaveFileDialog() { Filter = "HTML Web Page (*.html) |*.html" };
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        File.WriteAllText(saveFileDialog.FileName, FilesListToHtmlTable(files));
    }
}

Результат:

<html><body><table cellspacing="0" border="1"><tr><th>Файл</th><th>Данные</th></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\01test_login.html">01test_login.html</a></td><td>Finished in <strong>0m49.929s seconds</strong><br>3 scenarios (3 passed)<br>18 steps (18 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\02test_registeruser.html">02test_registeruser.html</a></td><td>Finished in <strong>0m25.364s seconds</strong><br>2 scenarios (2 passed)<br>28 steps (28 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\03test_psendinvite.html">03test_psendinvite.html</a></td><td>Finished in <strong>1m49.326s seconds</strong><br>1 scenario (1 passed)<br>58 steps (58 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\100test_checkcalcmodes_in_contractmanagementdlg.html">100test_checkcalcmodes_in_contractmanagementdlg.html</a></td><td>Finished in <strong>1m53.309s seconds</strong><br>2 scenarios (2 passed)<br>73 steps (73 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\101test_plockversions.html">101test_plockversions.html</a></td><td>Finished in <strong>1m18.717s seconds</strong><br>1 scenario (1 passed)<br>101 steps (101 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\102test_check_newversion_savereload.feature.html">102test_check_newversion_savereload.feature.html</a></td><td>Finished in <strong>0m49.488s seconds</strong><br>2 scenarios (1 failed, 1 passed)<br>135 steps (1 failed, 14 skipped, 120 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\98test_save_as_pricingset.html">98test_save_as_pricingset.html</a></td><td>Finished in <strong>2m1.599s seconds</strong><br>3 scenarios (3 passed)<br>156 steps (156 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\99test_billpayment_status.html">99test_billpayment_status.html</a></td><td>Finished in <strong>0m50.857s seconds</strong><br>1 scenario (1 passed)<br>37 steps (37 passed)<br></td></tr><tr><td><a href="file:///C:\Source\ConsoleApp1\ConsoleApp1\bin\Debug\result.html">result.html</a></td><td></td></tr></table></body></html>

→ Ссылка