/// <summary> /// Получить кокнертный XPath путем замены переменной части на конкретное значение. /// </summary> /// <param name="xPathesDto">XPath адрес.</param> /// <param name="OldSubString">Переменная часть XPath адреса</param> /// <param name="NewSubString">Значение переменной части XPath адреса</param> /// <returns></returns> private CurrencyXPathesDto GetActualXpath(CurrencyXPathesDto xPathesDto, string OldSubString, string NewSubString) { var NewXpathes = new CurrencyXPathesDto { ExchangeRate = xPathesDto.ExchangeRate.Replace(OldSubString, NewSubString), TextCode = xPathesDto.TextCode.Replace(OldSubString, NewSubString), Unit = xPathesDto.Unit.Replace(OldSubString, NewSubString) }; return(NewXpathes); }
/// <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); }