public static List<WikiTable> GetProtocolTables() { var webClient = new WebClient(); var html = webClient.DownloadString("http://wiki.vg/Protocol"); var doc = new HtmlDocument(); doc.LoadHtml(html); var ids = new List<string>(); foreach (var htmlTable in doc.DocumentNode.Descendants("h4")) { var span = htmlTable.Element("span"); if (span.GetAttributeValue("class", string.Empty).Equals("mw-headline")) ids.Add(span.GetAttributeValue("id", "NONE")); } var tables = new List<WikiTable>(); foreach (var htmlTable in doc.DocumentNode.Descendants("table")) { if (htmlTable.GetAttributeValue("class", string.Empty).Equals("wikitable")) { var table = new WikiTable(); // HEADERS var elements = htmlTable.Elements("tr"); { var first_tr = elements.ElementAt(0); foreach (var th in first_tr.Elements("th")) table.Headers.Add(th.InnerText); table.Height = elements.Count() - 1; } // VALUES int x = 0; int y = 0; for (int i = 1; i < elements.Count(); i++) { var tr = elements.ElementAt(i); y = 0; foreach (var td in tr.Elements("td")) { string rowspan; if ((rowspan = td.GetAttributeValue("rowspan", string.Empty)) != string.Empty) table.RepeatAtY(x, y, int.Parse(rowspan)); string colspan; if ((colspan = td.GetAttributeValue("colspan", string.Empty)) != string.Empty) table.RepeatAtX(x, y, int.Parse(colspan)); table.AddCell(x, td.InnerText.Trim().Replace("\n", string.Empty), rowspan != string.Empty); y++; } x++; } tables.Add(table); } } var index = 0; return tables.Where(t => { var rValue = t.Headers.Any(h => h.Contains("Packet ID")); if(rValue) { t.Name = ids[index]; index++; } return rValue; }).ToList(); }
public static List <WikiTable> GetProtocolTables() { var webClient = new WebClient(); var html = webClient.DownloadString("http://wiki.vg/Protocol"); var doc = new HtmlDocument(); doc.LoadHtml(html); var ids = new List <string>(); foreach (var htmlTable in doc.DocumentNode.Descendants("h4")) { var span = htmlTable.Element("span"); if (span.GetAttributeValue("class", string.Empty).Equals("mw-headline")) { ids.Add(span.GetAttributeValue("id", "NONE")); } } var tables = new List <WikiTable>(); foreach (var htmlTable in doc.DocumentNode.Descendants("table")) { if (htmlTable.GetAttributeValue("class", string.Empty).Equals("wikitable")) { var table = new WikiTable(); // HEADERS var elements = htmlTable.Elements("tr"); { var first_tr = elements.ElementAt(0); foreach (var th in first_tr.Elements("th")) { table.Headers.Add(th.InnerText); } table.Height = elements.Count() - 1; } // VALUES int x = 0; int y = 0; for (int i = 1; i < elements.Count(); i++) { var tr = elements.ElementAt(i); y = 0; foreach (var td in tr.Elements("td")) { string rowspan; if ((rowspan = td.GetAttributeValue("rowspan", string.Empty)) != string.Empty) { table.RepeatAtY(x, y, int.Parse(rowspan)); } string colspan; if ((colspan = td.GetAttributeValue("colspan", string.Empty)) != string.Empty) { table.RepeatAtX(x, y, int.Parse(colspan)); } table.AddCell(x, td.InnerText.Trim().Replace("\n", string.Empty), rowspan != string.Empty); y++; } x++; } tables.Add(table); } } var index = 0; return(tables.Where(t => { var rValue = t.Headers.Any(h => h.Contains("Packet ID")); if (rValue) { t.Name = ids[index]; index++; } return rValue; }).ToList()); }