/// <summary> /// Handles the result. /// </summary> /// <param name="canadaPostResponse">The response from Canada Post.</param> /// /// <param name="language">The language.</param> /// <returns></returns> private RequestResult HandleResult(string canadaPostResponse, CanadaPostLanguageEnum language) { var result = new RequestResult(); if (String.IsNullOrEmpty(canadaPostResponse)) { result.IsError = true; result.StatusCode = 0; result.StatusMessage = "Unable to connect to Canada Post."; return(result); } var doc = new XmlDocument(); doc.LoadXml(canadaPostResponse); XElement resultRates = XElement.Load(new StringReader(canadaPostResponse)); IEnumerable <XElement> query; // if we have any errors if (doc.GetElementsByTagName("error").Count > 0) { // query using LINQ the "error" node in the XML query = from errors in resultRates.Elements("error") select errors; XElement error = query.First(); if (error != null) { // set the status code information of the request result.StatusCode = Convert.ToInt32(error.Element("statusCode").Value); result.StatusMessage = error.Element("statusMessage").Value; result.IsError = true; } } else { // query using LINQ the "ratesAndServicesResponse" node in the XML because it contains // the actual status code information query = from response in resultRates.Elements("ratesAndServicesResponse") select response; XElement info = query.First(); // if we have informations if (info != null) { // set the status code information of the request result.StatusCode = Convert.ToInt32(info.Element("statusCode").Value); result.StatusMessage = info.Element("statusMessage").Value; // query using LINQ all the returned "product" nodes in the XML query = from prod in resultRates.Elements("ratesAndServicesResponse").Elements("product") select prod; foreach (XElement product in query) { // set the information related to this available rate var rate = new DeliveryRate(); rate.Sequence = Convert.ToInt32(product.Attribute("sequence").Value); rate.Name = product.Element("name").Value; rate.Amount = Convert.ToDecimal(product.Element("rate").Value, new CultureInfo("en-US", false).NumberFormat); DateTime shipDate; if (DateTime.TryParse(product.Element("shippingDate").Value, out shipDate) == true) { rate.ShippingDate = shipDate; } DateTime delivDate; if (DateTime.TryParse(product.Element("deliveryDate").Value, out delivDate) == true) { CultureInfo culture; if (language == CanadaPostLanguageEnum.French) { culture = new CultureInfo("fr-ca"); rate.DeliveryDate = delivDate.ToString("d MMMM yyyy", culture); } else { culture = new CultureInfo("en-us"); rate.DeliveryDate = delivDate.ToString("MMMM d, yyyy", culture); } } else { //rate.DeliveryDate = product.Element("deliveryDate").Value; rate.DeliveryDate = string.Empty; } result.AvailableRates.Add(rate); } query = from packing in resultRates.Elements("ratesAndServicesResponse").Elements("packing").Elements("box") select packing; foreach (XElement packing in query) { var box = new BoxDetail(); box.Name = packing.Element("name").Value; box.Weight = Convert.ToDouble(packing.Element("weight").Value, new CultureInfo("en-US", false).NumberFormat); box.ExpediterWeight = Convert.ToDouble(packing.Element("expediterWeight").Value, new CultureInfo("en-US", false).NumberFormat); box.Length = Convert.ToDouble(packing.Element("length").Value, new CultureInfo("en-US", false).NumberFormat); box.Width = Convert.ToDouble(packing.Element("width").Value, new CultureInfo("en-US", false).NumberFormat); box.Height = Convert.ToDouble(packing.Element("height").Value, new CultureInfo("en-US", false).NumberFormat); box.Quantity = Convert.ToInt32(packing.Element("packedItem").Element("quantity").Value); // add the box to the result result.Boxes.Add(box); } } } return(result); }
/// <summary> /// Handles the result. /// </summary> /// <param name="canadaPostResult">The result from Canada Post.</param> /// <returns></returns> private RequestResult HandleResult(string canadaPostResponse, CanadaPostLanguageEnum language) { var result = new RequestResult(); if (String.IsNullOrEmpty(canadaPostResponse)) { result.IsError = true; result.StatusCode = 0; result.StatusMessage = "Unable to connect to Canada Post."; return result; } var doc = new XmlDocument(); doc.LoadXml(canadaPostResponse); XElement resultRates = XElement.Load(new StringReader(canadaPostResponse)); IEnumerable<XElement> query; // if we have any errors if (doc.GetElementsByTagName("error").Count > 0) { // query using LINQ the "error" node in the XML query = from errors in resultRates.Elements("error") select errors; XElement error = query.First(); if (error != null) { // set the status code information of the request result.StatusCode = Convert.ToInt32(error.Element("statusCode").Value); result.StatusMessage = error.Element("statusMessage").Value; result.IsError = true; } } else { // query using LINQ the "ratesAndServicesResponse" node in the XML because it contains // the actual status code information query = from response in resultRates.Elements("ratesAndServicesResponse") select response; XElement info = query.First(); // if we have informations if (info != null) { // set the status code information of the request result.StatusCode = Convert.ToInt32(info.Element("statusCode").Value); result.StatusMessage = info.Element("statusMessage").Value; // query using LINQ all the returned "product" nodes in the XML query = from prod in resultRates.Elements("ratesAndServicesResponse").Elements("product") select prod; foreach (XElement product in query) { // set the information related to this available rate var rate = new DeliveryRate(); rate.Sequence = Convert.ToInt32(product.Attribute("sequence").Value); rate.Name = product.Element("name").Value; rate.Amount = Convert.ToDecimal(product.Element("rate").Value, new CultureInfo("en-US", false).NumberFormat); DateTime shipDate; if (DateTime.TryParse(product.Element("shippingDate").Value, out shipDate) == true) { rate.ShippingDate = shipDate; } DateTime delivDate; if (DateTime.TryParse(product.Element("deliveryDate").Value, out delivDate) == true) { CultureInfo culture; if (language == CanadaPostLanguageEnum.French) { culture = new CultureInfo("fr-ca"); rate.DeliveryDate = delivDate.ToString("d MMMM yyyy", culture); } else { culture = new CultureInfo("en-us"); rate.DeliveryDate = delivDate.ToString("MMMM d, yyyy", culture); } } else { //rate.DeliveryDate = product.Element("deliveryDate").Value; rate.DeliveryDate = string.Empty; } result.AvailableRates.Add(rate); } query = from packing in resultRates.Elements("ratesAndServicesResponse").Elements("packing").Elements("box") select packing; foreach (XElement packing in query) { var box = new BoxDetail(); box.Name = packing.Element("name").Value; box.Weight = Convert.ToDouble(packing.Element("weight").Value, new CultureInfo("en-US", false).NumberFormat); box.ExpediterWeight = Convert.ToDouble(packing.Element("expediterWeight").Value, new CultureInfo("en-US", false).NumberFormat); box.Length = Convert.ToDouble(packing.Element("length").Value, new CultureInfo("en-US", false).NumberFormat); box.Width = Convert.ToDouble(packing.Element("width").Value, new CultureInfo("en-US", false).NumberFormat); box.Height = Convert.ToDouble(packing.Element("height").Value, new CultureInfo("en-US", false).NumberFormat); box.Quantity = Convert.ToInt32(packing.Element("packedItem").Element("quantity").Value); // add the box to the result result.Boxes.Add(box); } } } return result; }