Ich wollte einige Daten aus einer HTML-Tabelle importieren (hier ist ein Link http://road2paris.com/wp-content/themes/roadtoparis/api/generated_table_august.html ) und die ersten 16 Personen in DataGridView in meiner Formularanwendung anzeigen. Nach dem, was ich gelesen habe, ist es am besten, HTML Agility Pack zu verwenden, also habe ich es heruntergeladen und in mein Projekt aufgenommen. Ich verstehe, dass das erste, was zu tun ist, den Inhalt der HTML-Datei zu laden. Dies ist der Code, mit dem ich das gemacht habe:
string htmlCode = "";
using (WebClient client = new WebClient())
{
client.Headers.Add(HttpRequestHeader.UserAgent, "AvoidError");
htmlCode = client.DownloadString("http://road2paris.com/wp-content/themes/roadtoparis/api/generated_table_august.html");
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlCode);
Und dann blieb ich stecken. Ich weiß nicht, wie ich meine Datentabelle mit Daten aus der HTML-Tabelle füllen soll. Ich habe viele verschiedene Lösungen ausprobiert, aber nichts scheint richtig zu funktionieren. Ich wäre froh, wenn mir jemand dabei helfen könnte.
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlCode);
var headers = doc.DocumentNode.SelectNodes("//tr/th");
DataTable table = new DataTable();
foreach (HtmlNode header in headers)
table.Columns.Add(header.InnerText); // create columns from th
// select rows with td elements
foreach (var row in doc.DocumentNode.SelectNodes("//tr[td]"))
table.Rows.Add(row.SelectNodes("td").Select(td => td.InnerText).ToArray());
Sie benötigen die HTML Agility Pack-Bibliothek, um diesen Code zu verwenden.
Unten habe ich Code erstellt, der doppelte Datenheader verhindert. Wenn Sie eine DataTable erstellen, muss jede "Spalte" einen eindeutigen Namen haben. Außerdem kann es vorkommen, dass eine HTML-Zeile außerhalb des zulässigen Bereichs liegt und Sie der Datentabelle zusätzliche Spalten hinzufügen müssen. Andernfalls werden Daten gelöscht. Das war meine Lösung.
'''
public enum DuplicateHeaderReplacementStrategy
{
AppendAlpha,
AppendNumeric,
Delete
}
public class HtmlServices
{
private static readonly string[] Alpha = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
public static HtmlDocument RenameDuplicateHeaders(HtmlDocument doc, DuplicateHeaderReplacementStrategy strategy)
{
var index = 0;
try
{
foreach (HtmlNode table in doc.DocumentNode?.SelectNodes("//table"))
{
var tableHeaders = table.SelectNodes("th")?
.GroupBy(x => x)?
.Where(g => g.Count() > 1)?
.ToList();
tableHeaders?.ForEach(y =>
{
switch (strategy)
{
case DuplicateHeaderReplacementStrategy.AppendNumeric:
y.Key.InnerHtml += index++;
break;
case DuplicateHeaderReplacementStrategy.AppendAlpha:
y.Key.InnerHtml += Alpha[index++];
break;
case DuplicateHeaderReplacementStrategy.Delete:
y.Key.InnerHtml = string.Empty;
break;
}
});
}
return doc;
}
catch
{
return doc;
}
}
}
public static DataTable GetDataTableFromHtmlTable(string url, string[] htmlIds)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);
string html = doc.DocumentNode.OuterHtml;
doc = HtmlServices.RenameDuplicateHeaders(doc, DuplicateHeaderReplacementStrategy.AppendNumeric);
var headers = doc.DocumentNode.SelectNodes("//tr/th");
DataTable table = new DataTable();
foreach (HtmlNode header in headers)
if (!table.ColumnExists(header.InnerText))
{
table.Columns.Add(header.InnerText); // create columns from th
}
else
{
int columnIteration = 0;
while (table.ColumnExists(header.InnerText + columnIteration.ToString()))
{
columnIteration++;
}
table.Columns.Add(header.InnerText + columnIteration.ToString()); // create columns from th
}
// select rows with td elements
foreach (var row in doc.DocumentNode.SelectNodes("//tr[td]"))
{
var addRow = row.SelectNodes("td").Select(td => td.InnerHtml.StripHtmlTables()).ToArray();
if (addRow.Count() > table.Columns.Count)
{
int m_numberOfRowsToAdd = addRow.Count() - table.Columns.Count;
for (int i = 0; i < m_numberOfRowsToAdd; i++)
table.Columns.Add($"ExtraColumn {i + 1}");
}
try
{
table.Rows.Add(addRow);
}
catch (Exception e)
{
debug.Print(e.Message);
}
}
return table;
}