/// <summary> /// Получить курсы валют банка по заданной html странице. /// </summary> /// <param name="html">Страница с обменными курсами.</param> /// <param name="request">Данные для запроса к банку.</param> /// <returns></returns> private BankRatesDto GetBankRatesFromHtml(HtmlDocument html, BankRequestDto request) { // Получить методы для обработки текста. WordProcessingHandler UnitProcess = GetMethods(request.UnitScripts); WordProcessingHandler TextCodeProcess = GetMethods(request.TextCodeScripts); var bankRates = new BankRatesDto { Name = request.Name, Currency = request.Currency, SwiftCode = request.SwiftCode, RequestResultStatus = ProcessingResultDto.ResultType.Success }; List <CurrencyDataDto> currencyDataList; // Выполнить парсинг валют банка по строкам. if (html != null) { currencyDataList = new List <CurrencyDataDto>(request.EndXpathRow - request.StartXpathRow + 1); for (var i = request.StartXpathRow; i <= request.EndXpathRow; i++) { CurrencyDataDto currencyData = GetCurrencyData(html, request, i, UnitProcess, TextCodeProcess); // Проверить успешность получения данных валюты. if (currencyData.RequestResultStatus != ProcessingResultDto.ResultType.Success) { bankRates.RequestResultStatus = ProcessingResultDto.ResultType.ProcessedWithErrors; bankRates.RequestResultMessage += $"Ошибка при получении данных валюты. {currencyData.TextCode}{Environment.NewLine}"; } currencyDataList.Add(currencyData); } bankRates.ExchangeRates = currencyDataList; } else { bankRates.RequestResultStatus = ProcessingResultDto.ResultType.Error; bankRates.RequestResultMessage = "Ошибка при получении html страницы."; bankRates.ExchangeRates = Array.Empty <CurrencyDataDto>(); } return(bankRates); }
/// <summary> /// Получить данные одной валюты. /// </summary> /// <param name="html">Страница для поиска валюты.</param> /// <param name="pathes">Адреса XPath.</param> /// <returns></returns> private CurrencyDataDto GetCurrencyData(HtmlDocument html, BankRequestDto request, int rowNum, WordProcessingHandler unitProcess, WordProcessingHandler textcodeProcess) { // Данные валюты. var currencyData = new CurrencyDataDto(); // Установить переменную часть XPath адреса. var pathes = new CurrencyXPathesDto(); try { pathes = GetActualXpath(request.XPathes, request.VariablePartOfXpath, rowNum.ToString()); } catch (Exception e) { currencyData.RequestResultStatus = ProcessingResultDto.ResultType.Error; currencyData.RequestResultMessage = $"Ошибка при получении уточненного адреса XPath: {e.Message}"; return(currencyData); } // Установить разделитель разрядов и десятичной части. var formatInfo = new NumberFormatInfo { NumberDecimalSeparator = request.NumberDecimalSeparator, NumberGroupSeparator = request.NumberGroupSeparator }; // Получить значения данных для валюты со страницы через XPath. try { // Получить значения по адресу XPath string textCode = GetValueByXPath(html, pathes.TextCode); string exchangeRate = GetValueByXPath(html, pathes.ExchangeRate); string unit = GetValueByXPath(html, pathes.Unit); // Выделить из строки необходимый текст. unit = unitProcess(unit); textCode = textcodeProcess(textCode); // Конвертация строки в число (обменный курс). currencyData.RequestResultStatus = ProcessingResultDto.ResultType.Success; if (decimal.TryParse(exchangeRate, NumberStyles.Currency, formatInfo, out decimal exchangeRateResult)) { currencyData.ExchangeRateValue = exchangeRateResult; } else { currencyData.ExchangeRateValue = 0; currencyData.RequestResultStatus = ProcessingResultDto.ResultType.Error; currencyData.RequestResultMessage += "Ошибка при конвертации зачения обменного курса (ExchangeRate). "; } // Конвертация строки в число (единица измерения). if (int.TryParse(unit, out int unitResult)) { currencyData.Unit = unitResult; } else { currencyData.Unit = 0; currencyData.RequestResultStatus = ProcessingResultDto.ResultType.Error; currencyData.RequestResultMessage += "Ошибка при конвертации зачения единицы измерения валюты (Unit). "; } currencyData.TextCode = textCode; } catch (FormatException e) { currencyData.RequestResultStatus = ProcessingResultDto.ResultType.Error; currencyData.RequestResultMessage = e.Message; } catch (ArgumentNullException e) { currencyData.RequestResultStatus = ProcessingResultDto.ResultType.Error; currencyData.RequestResultMessage = e.ParamName; } return(currencyData); }