Как добавить анализ документа (определённая часть 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>

