1

Моя программа при выполнении формирует таблицу с гиперссылками на 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

  • Я обновил ответ – aepot Jul 17 '20 at 16:37
  • Вы сами формируете ту таблицу? Если да, то прямо в тот код добавьте вставку дополнительного html. И не нужно ничего парсить. – Alexander Petrov Jul 17 '20 at 17:17
  • @AlexanderPetrov чуть ниже решение уже есть, ровно то, что автор просил. (я надеюсь) – aepot Jul 17 '20 at 17:53
  • @aepot - В вопросе автор пишет "Моя программа формирует" - я так понимаю, он сам создаёт html. Так зачем его потом парсить повторно? Если можно сразу при создании добавить колонку в таблицу. – Alexander Petrov Jul 17 '20 at 18:03
  • @AlexanderPetrov он имеет в виду саммари таблицу по файлам, сформированным сторонним софтом. Но я понял, да, так бы проще было. – aepot Jul 17 '20 at 18:22
  • У меня появился вопрос. Почему у меня ограничение на 100 файлов? А также как добавить отображения цвета в конце выполнения? (т.е. если всё прошло то зелёным, а если нет красным) – Дмитрий Шмелёв Sep 17 '20 at 15:16

1 Answers1

0

Установите 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(&quot;tr&quot;));

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

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

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

    foreach (HtmlNode node in nodes)
    {
        if (node.InnerHtml.Trim().StartsWith(&quot;document.getElementById&quot;))
        {
            string text = node.InnerHtml.Split('&quot;')[1].Trim();
            cell.InnerHtml += text;
            cell.AppendChild(doc.CreateElement(&quot;br&quot;));
        }
    }
}
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>
aepot
  • 49,560
  • 1
    Ну, задача после правки вполне понятна. У человека есть в директории HTML файлы сгененированные некой тулзой (он их предоставил), в каждом файле есть блок с информацией (как я понял за сколько этот файл был сгенерирован). Человеку надо сделать табличку, где будет ссылка на сам файл и рядом информация из файла. Конкретно ваш ответ мало чем ему поможет, да и по сути если так смотреть, то это дубликат. Если хотите, можете распарсить один из файлов, достав нужную инфу. – EvgeniyZ Jul 17 '20 at 15:20
  • У меня появился вопрос. Почему у меня ограничение на 100 файлов? А также как добавить отображения цвета в конце выполнения? (т.е. если всё прошло то зелёным, а если нет красным) – Дмитрий Шмелёв Sep 17 '20 at 15:15
  • @ДмитрийШмелёв никаких ограничений в коде нет. А чтобы задать цвет, можете добавить нужной ноде например .Attributes.Add("style", "background-color: #ff0000;"); Лучше задайте новый вопрос. – aepot Sep 17 '20 at 15:40