Stap 1:
[CPP]public class Parser
{
private const string BaseUrl = "http://www.wakanutgeve.nl/";
public async Task<List<MatchResult>> RefactoredDownloadResultsAsync()
{
var url = string.Format("{0}113/laatste-uitslagen/", BaseUrl);
using (var client = new HttpClient())
{
var source = await client.GetStringAsync(new Uri(url));
var doc = CreateDocument(source);
var results = new List<MatchResult>();
var resultNodes = doc.DocumentNode.Descendants("div")
.Where(node => node.HasAttributes && node.Attributes.Contains("id"))
.First(node => node.Attributes["id"].Value.Equals("ctl00_Mp_SkinHtml_content_ctl01_ctl04_UitslagenControl1_LaatsteUitslagenPanel"))
.Descendants("table").First()
.Descendants("tr");
foreach (HtmlNode resultRow in resultNodes)
{
if (resultRow.HasAttributes) //title row has no attributes
{
try
{
var date = resultRow.Descendants("td")
.Where(node => node.HasAttributes && node.Attributes.Contains("class"))
.First(node => node.Attributes["class"].Value.Equals("datum"))
.InnerText.Trim();
var time = resultRow.Descendants("td")
.Where(node => node.HasAttributes && node.Attributes.Contains("class"))
.First(node => node.Attributes["class"].Value.Equals("tijd"))
.InnerText.Trim();
var home = resultRow.Descendants("td")
.Where(node => node.HasAttributes && node.Attributes.Contains("class"))
.First(node => node.Attributes["class"].Value.Equals("thuis"))
.InnerText.Trim();
var visitors = resultRow.Descendants("td")
.Where(node => node.HasAttributes && node.Attributes.Contains("class"))
.First(node => node.Attributes["class"].Value.Equals("uit"))
.InnerText.Trim();
var result = resultRow.Descendants("td")
.Where(node => node.HasAttributes && node.Attributes.Contains("class"))
.First(node => node.Attributes["class"].Value.Equals("uitslag"))
.InnerText.Trim();
var matchResult = new MatchResult(date, time, home, visitors, result);
results.Add(matchResult);
Debug.WriteLine("\t\t Found Result: [{0}]", matchResult);
}
catch (Exception ex)
{
Debug.WriteLine("\t\t Error getting match result: [{0}]", ex.Message);
}
}
}
return results;
}
}
private HtmlDocument CreateDocument(string source)
{
var doc = new HtmlDocument();
doc.LoadHtml(source);
return doc;
}
}[/CPP]
Ik zal zo even de dubbele code vervangen door methods maar dit werkt al.
Hier staan wat methods die het makkelijker & leesbaar maken. Maakt het omzetten van de andere ook een stuk makkelijker.
[CPP]public class Parser
{
private const string BaseUrl = "http://www.wakanutgeve.nl/";
public async Task<List<MatchResult>> RefactoredDownloadResultsAsync()
{
var url = string.Format("{0}113/laatste-uitslagen/", BaseUrl);
using (var client = new HttpClient())
{
var source = await client.GetStringAsync(new Uri(url));
var doc = CreateDocument(source);
var results = new List<MatchResult>();
var resultNodes = SelectNode(doc.DocumentNode, "div", "id", "ctl00_Mp_SkinHtml_content_ctl01_ctl04_UitslagenControl1_LaatsteUitslagenPanel")
.Descendants("table").First()
.Descendants("tr");
foreach (var resultRow in resultNodes)
{
if (resultRow.HasAttributes) //title row has no attributes
{
try
{
var dateNode = SelectNode(resultRow, "td", "class", "datum");
var date = SelectContent(dateNode);
var timeNode = SelectNode(resultRow, "td", "class", "tijd");
var time = SelectContent(timeNode);
var homeNode = SelectNode(resultRow, "td", "class", "thuis");
var home = SelectContent(homeNode);
var visitorsNode = SelectNode(resultRow, "td", "class", "uit");
var visitors = SelectContent(visitorsNode);
var resultNode = SelectNode(resultRow, "td", "class", "uitslag");
var result = SelectContent(resultNode);
//of
//var result = SelectContent(SelectNode(resultRow, "td", "class", "uitslag"));
results.Add(new MatchResult(date, time, home, visitors, result));
Debug.WriteLine("\t\t Found Result: [{0}]", results.Last());
}
catch (Exception ex)
{
Debug.WriteLine("\t\t Error getting match result: [{0}]", ex.Message);
}
}
}
return results;
}
}
private HtmlDocument CreateDocument(string source)
{
var doc = new HtmlDocument();
doc.LoadHtml(source);
return doc;
}
private HtmlNode SelectNode(HtmlNode inputNode, string nodeName, string attributeName, string attributeValue)
{
return inputNode.Descendants(nodeName)
.Where(node => node.HasAttributes && node.Attributes.Contains(attributeName))
.First(node => node.Attributes[attributeName].Value.Equals(attributeValue));
}
private string SelectContent(HtmlNode node)
{
return node.InnerText.Trim();
}
}[/CPP]