/// <summary> /// Gets all alcoholic products from the LCBO website. /// </summary> /// <returns></returns> public List<LcboProduct> GetAllProducts() { List<LcboProduct> result = new List<LcboProduct>(); Dictionary<string, LcboProduct> resultDictionary = new Dictionary<string, LcboProduct>(); HtmlDocument doc = this.productListPageRetriever.RetrievePageHtml(String.Empty); var productNodes = doc.DocumentNode.SelectNodes(String.Format("//a[@id[starts-with(.,'{0}')]]", Resources.ItemAnchorIdPrefix)); if (productNodes != null) { foreach (HtmlNode link in productNodes) { HtmlAttribute linkId = link.Attributes["id"]; string idName = linkId.Value; string idNumber = idName.Substring(Resources.ItemAnchorIdPrefix.Length, idName.Length - Resources.ItemAnchorIdPrefix.Length - 1); LcboProduct currentProduct; if (!resultDictionary.ContainsKey(idNumber)) { currentProduct = new LcboProduct(); resultDictionary.Add(idNumber, currentProduct); } else { currentProduct = resultDictionary[idNumber]; } char idNameLastChar = idName[idName.Length - 1]; switch (idNameLastChar) { case '1': TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo; currentProduct.Name = textInfo.ToTitleCase((link.InnerText.ToLower(CultureInfo.CurrentCulture))); break; case '2': this.GetDetails(link.InnerText, currentProduct); //if (currentProduct.Id == 0) //{ // resultDictionary.Remove(idNumber); //} break; default: break; } } } // Filter out products with ID=0, which are non-alcoholic products, like gift bags var resultsWithNoId0Products = from p in resultDictionary.Values where p.Id != 0 select p; return resultsWithNoId0Products.ToList(); }
/// <summary> /// Gets the details. /// </summary> /// <param name="productText">The product text.</param> /// <param name="product">The product.</param> private void GetDetails(string productText, LcboProduct product) { string[] splitInnerText = productText.Split(new char[] { '\t', '\r', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries); List<string> linkText = new List<string>(); if (splitInnerText.Length > 0) { for (int i = 0; i < splitInnerText.Length - 1; i++) { splitInnerText[i] = splitInnerText[i].Trim(); if (splitInnerText[i] != String.Empty) { linkText.Add(splitInnerText[i]); } } } // Container product.Container = new LcboContainerFormat(); string[] containerSizeSplit; if (linkText.Count >= 6) { if (!linkText[4].Contains("x")) { containerSizeSplit = linkText[4].Split(); product.Container.NumberOfContainers = 1; product.Container.ContainerCapacity = Convert.ToDecimal(containerSizeSplit[0]); } else { containerSizeSplit = linkText[4].Split(new char[] { ' ', 'x' }); product.Container.NumberOfContainers = Convert.ToInt32(containerSizeSplit[0]); product.Container.ContainerCapacity = Convert.ToDecimal(containerSizeSplit[1]); } // Id product.Id = Convert.ToInt32(linkText[3]); // Origin product.CountryOfOrigin = linkText[0]; // Manufacturer product.Manufacturer = linkText[1]; // Price string[] priceSplit = linkText[5].Split(); if (priceSplit.Length >= 2) { product.Price = Convert.ToDecimal(priceSplit[1]); } } //if (!String.IsNullOrEmpty(product.Name)) //{ // StringBuilder result = new StringBuilder(product.Name); // if (product.Container.NumberOfContainers > 1) // { // result.Append(String.Format("{0}x", product.Container.NumberOfContainers)); // } // result.Append(String.Format("{0} ml", product.Container.ContainerCapacity)); // product.Name = result.ToString(); //} //TODO: Case when items<5 i.e. it's not a drink }