コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }